【发布时间】:2016-01-07 20:50:34
【问题描述】:
所以我已经从事这项任务一段时间了,但我遇到了一个问题。我一遍又一遍地尝试和重写,似乎无法提出足够好的解决方案。
我正在尝试将一个对象数组排序到另一个对象数组中。我正在使用敲除,但如果可以在 vanilla JS 或 jQuery 中更直接地完成,则解决方案不必包含敲除。
我会解释:
我们从 observableArray serials 开始,其中包含一些序列号对象。这个数组总是包含这种格式:
var serials = ko.observableArray([
{ number: "DFG09008", qty: 1 },
{ number: "DFG09009", qty: 1 },
{ number: "DFG09010", qty: 1 },
{ number: "DFG09011", qty: 1 },
{ number: "DFG09020", qty: 1 },
{ number: "ASD-0001", qty: 1 },
{ number: "ASD-0002", qty: 1 },
{ number: "HJ-DRT-06", qty: 1 },
{ number: "HJ-DRT-07", qty: 1 },
{ number: "POU055054", qty: 1 }
]);
// qty property is for something unrelated to this in the app
我正在编写的函数的预期结果是,它将输出到另一个 observableArray displaySerials,用于呈现“数值范围”的概念:
var displaySerials = ko.observableArray([
{ beginSerial: "DFG09008", endSerial: "DFG09011" },
{ beginSerial: "DFG09020", endSerial: "" },
{ beginSerial: "ASD-0001", endSerial: "ASD-0002" },
{ beginSerial: "HJ-DRT-06", endSerial: "HJ-DRT-07" },
{ beginSerial: "POU055054", endSerial: "" }
]);
所以,因为serials'前四个成员'number属性,"DFG09008", "DFG09009", "DFG09010", "DFG09011"有一个匹配的前缀(DFG090)和连续的后缀数字(8, 9, 10, 11),它们被放入一个对象中beginSerial 是范围内的最小数字 (DFG09008),endSerial 是最大数字 (DFG09011)。请注意,"DFG09020" 被放在一个单独的对象中。这是因为它与组中的其他数字不连续,因此它被单独考虑。
任何与组的其余部分无关的序列号都放入它自己的对象中,其中endSerial 属性是一个空字符串:{ beginSerial: "DFG09020", endSerial: "" }
序列号的唯一定义规则是它们总是以数字结尾。但集合中可能有数十或数百个。
有效解决方案的唯一要求是上述内容以及:
- 数组
serials在此功能过程中应保持不变。 - 解决方案不是特定的,也不依赖于连续剧的任何字符串结构,除了它们以数字结尾。
非常感谢任何贡献!
【问题讨论】:
-
您尚未在问题本身中包含当前排序的方式。您能否添加它,并告诉我们具体问题出在哪里? (此外,您将从单元测试中很多受益。将您的人类可读规范转换为自动化测试:这肯定值得您花时间!)
标签: javascript jquery arrays knockout.js