Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用主键和辅键对数据进行反规范化_Javascript_Arrays_Sorting - Fatal编程技术网

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})```@食尸鬼谢谢你的提示。我试图避免大量的代码修改,以使原始作者能够轻松地看到更改。