Javascript 如何使用主键和辅键对数据进行反规范化
我正在尝试将此规范化数据集排序为从Javascript 如何使用主键和辅键对数据进行反规范化,javascript,arrays,sorting,Javascript,Arrays,Sorting,我正在尝试将此规范化数据集排序为从set\u no=0,line\u no=0开始的项目 使用此功能,所有项目都已正确装箱,但不会更新set\u no和line\u 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"}},
set\u no=0
,line\u no=0
开始的项目
使用此功能,所有项目都已正确装箱,但不会更新set\u no
和line\u 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
}
}
]
}
]
这可能是答案:
函数反规范化数据(数据){
让result=Object.values(//索引键,从0开始
data.reduce((r,{order},i,arr)=>{//Push items to order,匹配唯一购物车id
设{header,line}=arr[i];
让项={标题,行};
r[order.cart_id]=(r[order.cart_id]|{订单,项目:[]});
r[order.cart\u id].items.push(item);
item.header.set_no=Object.keys(r).indexOf(order.cart_id);
item.line.line\u no=r[order.cart\u id].items.length-1;
返回r;
}, {})
);
log(JSON.stringify(result,null,4));
}
非规范化数据(数据);
正如您所看到的,line\u no
实际上是当前顺序中的项目数减去一,因此我在那里使用items.length-1
但是set\u no
有点复杂,因为顺序块可能是无序的,这就是为什么我得到当前顺序的索引(对象键有一些魔力,因为这不是数组,而是对象)
另外,我已经从输出中删除了零散的
顺序
结构,以匹配您的示例。添加预期输出将极大地帮助试图回答此问题的人。现在更新了…这真的很好!我刚把几行改成let item=arr[I];删除arr[i][‘订单’]
因为正在使用的数据
对象有点复杂。另外,感谢您教我console.log(JSON.stringify(result,null,4))代码>:)没有问题。只需确保您不会在生产中使用它,因为空间占用了太多的空间。@alx,您可以使用这个``r[order.cart\u id].items.push({header:{set\u no:Object.keys(r).indexOf(order.cart\u id)},line:{line\u no:r[order.cart\u id].items.length})```@食尸鬼谢谢你的提示。我试图避免大量的代码修改,以使原始作者能够轻松地看到更改。