Как денормализовать данные с помощью первичного и вторичного ключей - PullRequest
2 голосов
/ 23 июня 2019

Я пытаюсь отсортировать этот нормализованный набор данных в заказы с элементами, начинающимися с 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 и 1 для набора 0 и строки 0 для набора 1.

Как мне начать с 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
            }
         }
      ]
   }
]

1 Ответ

2 голосов
/ 23 июня 2019

Это может быть ответом:

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 из вывода, чтобы она соответствовала вашему примеру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...