我正在尝试将此规范化的数据集按从set_no = 0
,line_no = 0
开始的项目排序。
使用此功能,所有项目都可以正确分类,但是set_no
和line_no
不会更新。
let data = JSON.parse('[{"header":{"set_no":0},"line":{"line_no":2},"order":{"cart_id":"X1"}},{"header":{"set_no":4},"line":{"line_no":6},"order":{"cart_id":"X2"}},{"header":{"set_no":8},"line":{"line_no":10},"order":{"cart_id":"X1"}}]');
function denormalizeData(data) {
let result = Object.values( // Index keys, starting with 0
data.reduce((r, { order }, i, arr) => { // Push items to order, matching on unique cart_id
let item = arr[i];
r[order.cart_id] = (r[order.cart_id] || { order, items: [] });
r[order.cart_id].items.push(item);
return r;
}, {})
);
console.log(JSON.stringify(result));
}
denormalizeData(data);
例如,在这种情况下,目标是对集合0的行0和1以及集合1的行0进行排序和更新。
在设置新数组时如何从set_no = 0
和line_no = 0
开始,并在推入新索引时相应地分别递增?
预期产量
[
{
"order":{
"cart_id":"X1"
},
"items":[
{
"header":{
"set_no":0
},
"line":{
"line_no":0
}
},
{
"header":{
"set_no":0
},
"line":{
"line_no":1
}
}
]
},
{
"order":{
"cart_id":"X2"
},
"items":[
{
"header":{
"set_no":1
},
"line":{
"line_no":0
}
}
]
}
]
答案 0 :(得分:2)
这可能是答案:
function denormalizeData(data) {
let result = Object.values( // Index keys, starting with 0
data.reduce((r, {order}, i, arr) => { // Push items to order, matching on unique cart_id
let {header, line} = arr[i];
let item = {header, line};
r[order.cart_id] = (r[order.cart_id] || {order, items: []});
r[order.cart_id].items.push(item);
item.header.set_no = Object.keys(r).indexOf(order.cart_id);
item.line.line_no = r[order.cart_id].items.length - 1;
return r;
}, {})
);
console.log(JSON.stringify(result, null, 4));
}
denormalizeData(data);
如您所见,line_no
实际上是许多项目减去当前顺序的一个项目,因此我在这里使用items.length - 1
。
但是set_no
有点复杂,因为顺序块可能会变得无序,这就是为什么我得到当前顺序的索引(带有对象键的某种魔术,因为这不是数组,而是对象)。
我还从输出中删除了杂散的order
结构,以匹配您的示例。