如何使用主键和副键对数据进行非规范化

时间:2019-06-22 23:30:16

标签: javascript arrays sorting

我正在尝试将此规范化的数据集按从set_no = 0line_no = 0开始的项目排序。

使用此功能,所有项目都可以正确分类,但是set_noline_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 = 0line_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
            }
         }
      ]
   }
]

1 个答案:

答案 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结构,以匹配您的示例。