Как установить индекс массива нормализованных данных - PullRequest
1 голос
/ 12 июня 2019

Я пытаюсь нормализовать набор данных, обновить индекс массива, а затем денормализовать данные.

Я бы хотел изменить P.O. в строке заголовка, и изменение распространяется на связанный порядок.

Модель данных выглядит следующим образом:

let numSet = 0;
let numLine = 2;

let data = [
  {
    "order": {
      "po_no": "original-po"
    },
    "items": [
      {
        "header": {
          "po_no": "keep-this-value",
          "set_no": 0
        },
        "line": {
          "id": "A123",
          "line_no": 1
        }
      },
      {
        "header": {
          "po_no": "update-with-this-value",
          "set_no": 0
        },
        "line": {
          "id": "B234",
          "line_no": 2
        }
      }
    ]
  }
];

// The logic to normalize the data (appending the order data to each index), works as expected

let normalizedDataSet = [];
for (let i = 0; i < data.length; i++) {
  for (let j = 0; j < data[i]['items'].length; j++) {
    data[i]['items'][j]['order'] = data[i]['order']; // Set default header
    normalizedDataSet.push(data[i]['items'][j]);
  }
}

// The logic to update the normalized data, updating too many indices

for (i = 0; i < normalizedDataSet.length; i++) {
  let index = normalizedDataSet[i];

  if (numSet === index['header']['set_no'] && numLine === index['line']['line_no']) {
    index['order']['po_no'] = index['header']['po_no'];
  }
}

console.log(normalizedDataSet); // Expected output below

Ожидаемый результат:

normalizedDataSet = [
  { 
    "header": { 
      "po_no": 'keep-this-value', 
      "set_no": 0 
    },
    "line": { 
      "id": 'A123', 
      "line_no": 1 
    },
    "order": { 
      "po_no": 'original-po' 
    } 
  },
  { 
    "header": { 
      "po_no": 'update-with-this-value', 
      "set_no": 0 
    },
    "line": { 
      "id": 'B234', 
      "line_no": 2 
    },
    "order": { 
      "po_no": 'update-with-this-value' 
    } 
  }
]

При построчном ведении журнала кажется, что он установлен правильно, но затем возникает сбой при входе в систему после выхода второго цикла for.

После обновления данных я бы хотел использовать исходную схему.

Проблема, с которой я столкнулся, заключается в том, что логика обновления изменяет все записи в одном и том же порядке, а не просто обновляет одну строку. (т.е. он обновляет (set_no = 0, line_no = 1) и (set_no = 0, line_no = 2), когда он должен обновлять только второй случай.

В таком случае, как мне обновить только второй индекс нормализованного набора данных?

1 Ответ

1 голос
/ 12 июня 2019

Я думаю, что проблема в этой строке.

data[i]['items'][j]['order'] = data[i]['order']; // Set default header

измените это на

data[i]['items'][j]['order'] = { ...data[i]['order'] }; // Set default header

Причина: в Javascript объекты назначаются по ссылке.Таким образом, объект заказа был указан в обоих пунктах.Когда вы распространяете его, он распаковывает свойства в новый объект, созданный литералом объекта, создавая поверхностную копию.

...