代码之家  ›  专栏  ›  技术社区  ›  Matthew

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

  •  1
  • Matthew  · 技术社区  · 7 年前

    我正在尝试将此规范化数据集排序为从 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进行排序和更新。

    我怎么开始 设置为0 和 行号=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 回复  |  直到 7 年前
        1
  •  2
  •   alx    7 年前

    这可能是答案:

    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 从输出结构匹配您的示例。