【问题标题】:How to set array index of normalized data如何设置归一化数据的数组索引
【发布时间】:2019-10-27 00:49:41
【问题描述】:

我正在尝试规范化数据集,更新数组索引,然后对数据进行非规范化。

我想更改邮政信箱。在标题行上,并将更改传播到链接订单。

数据模型如下:

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),而它应该只更新第二种情况。

在这种情况下,我将如何只更新规范化数据集的第二个索引?

【问题讨论】:

  • 我认为您也应该添加预期的输出。例如,如果在任何地方,我无法真正跟踪“主要”po_no 应该去哪里。
  • 好的。它已更新。当set_noline_no 匹配输入时,header po_no 应该设置order po_no
  • 我想在此更新步骤之后将非规范化回原始架构。

标签: javascript arrays normalization denormalization


【解决方案1】:

我认为问题出在这一行。

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

把这个改成

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

原因:在 Javascript 中,对象是通过引用分配的。因此,两个项目都引用了订单对象。当你传播它时,它会将属性解包到由对象字面量创建的新对象中,形成一个浅拷贝。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 2017-10-26
  • 2013-03-27
  • 2020-09-18
  • 1970-01-01
  • 2018-12-10
  • 2013-12-27
相关资源
最近更新 更多