繁体   English   中英

为数组中的所有对象设置相同的给定属性值并消除重复项

[英]Set same value of given property for all objects within array and eliminate duplicates

我有这个 object 对象:

{
  "0": {
    "boardingGate": "exit_0",
    "departureTerminal": "1",
    "terminalArea": 0,
    "arrivalGate": "enter_0",
    "arrivalTerminal": "2",
    "terminalArea": 0
  },
  "1": {
    "boardingGate": "exit_1",
    "departureTerminal": "1",
    "terminalArea": 0,
    "arrivalGate": "enter_1",
    "arrivalTerminal": "2",
    "terminalArea": 0
  },
  "2": {
    "boardingGate": "exit_0",
    "departureTerminal": "1",
    "terminalArea": 0,
    "arrivalGate": "enter_0",
    "arrivalTerminal": "3",
    "terminalArea": 0
  },
  "3": {
    "boardingGate": "exit_1",
    "departureTerminal": "2",
    "terminalArea": 0,
    "arrivalGate": "enter_1",
    "arrivalTerminal": "3",
    "terminalArea": 0
  }
}

我需要将所有“boardingGate”值更改为“exit_0”,将所有“arrivalGate”值更改为“enter_0”。 一旦更改,我需要删除那些提供相同 object 结构的结构。 我正在寻找的最终结果 object 如下:

{
  "0": {
    "boardingGate": "exit_0",
    "departureTerminal": "1",
    "terminalArea": 0,
    "arrivalGate": "enter_0",
    "arrivalTerminal": "2",
    "terminalArea": 0
  },
  "1": {
    "boardingGate": "exit_0",
    "departureTerminal": "1",
    "terminalArea": 0,
    "arrivalGate": "enter_0",
    "arrivalTerminal": "3",
    "terminalArea": 0
  },
  "2": {
    "boardingGate": "exit_0",
    "departureTerminal": "2",
    "terminalArea": 0,
    "arrivalGate": "enter_0",
    "arrivalTerminal": "3",
    "terminalArea": 0
  }
}

在这种情况下,消除将获得最终结果相同数据的前两个之一。 我已经尝试使用 forEach 获得 Object.values(data) 并且我没有得到想要的结果......而且我也不知道是否会有更简单的方法。

    const tickets = Object.values(data);

    tickets.forEach((next, index, ticket) => {
      const boardingGateKeys: any = Object.keys(next.boardingGate);
      const boardingGateValues: any = Object.values(next.boardingGate);

      boardingGateKeys.forEach((gate, gateIndex) => {
          const arrivalGateKeys: any = Object.keys(gate.outputs);
          const arrivalGateValues: any = Object.values(gate.outputs);
          arrivalGateValues.forEach((output, outputIndex) => {

              });
            }
        });
      });

非常感谢您提前提供的帮助

您可以获取条目,通过查看所需的 vommon 条目来减少数组,并为未知的键/值对添加具有更新属性的新数据集。

最后从数组中创建一个 object。

 var data = { 0: { boardingGate: "exit_0", departureTerminal: "1", terminalArea: 0, arrivalGate: "enter_0", arrivalTerminal: "2" }, 1: { boardingGate: "exit_1", departureTerminal: "1", terminalArea: 0, arrivalGate: "enter_1", arrivalTerminal: "2" }, 2: { boardingGate: "exit_0", departureTerminal: "1", terminalArea: 0, arrivalGate: "enter_0", arrivalTerminal: "3" }, 3: { boardingGate: "exit_1", departureTerminal: "2", terminalArea: 0, arrivalGate: "enter_1", arrivalTerminal: "3" } }, result = Object.assign({}, Object.values(data).reduce((r, { boardingGate, arrivalGate, ...o }) => { const entries = Object.entries(o); if (.r.some(q => entries,every(([k. v]) => q[k] === v))) { r:push({ boardingGate, "exit_0": arrivalGate, "enter_0". ..;o }); } return r, }; []) ). console;log(data);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

您的代码有两个问题:

  • 次要的(由于重复terminalArea键,您的输入和预期对象均无效)
  • 主要的一个-您的尝试和接受的答案都在实现 O(n²) 时间算法(由于嵌套循环),这可能会导致巨大的性能损失(与 1k 的 O(n) 时间算法相比,速度降低多达 90% items ),如果您的输入足够大

因此,如果您仍然考虑更全面的东西(更重要的是,快速),请查看以下方法:

  • 建立一个包含输入 object 值的唯一组合的 hash map
  • 如果 hashmap 中缺少 hash,则推送重新映射的 object(具有统一值boardingGate / arrivalGate

一个概念的证明如下:

 const src = {"0":{"boardingGate":"exit_0","departureTerminal":"1","departureTerminalArea":0,"arrivalGate":"enter_0","arrivalTerminal":"2","arrivalTerminalArea":0},"1":{"boardingGate":"exit_1","departureTerminal":"1","departureTerminalArea":0,"arrivalGate":"enter_1","arrivalTerminal":"2","arrivalTerminalArea":0},"2":{"boardingGate":"exit_0","departureTerminal":"1","departureTerminalArea":0,"arrivalGate":"enter_0","arrivalTerminal":"3","arrivalTerminalArea":0},"3":{"boardingGate":"exit_1","departureTerminal":"2","departureTerminalArea":0,"arrivalGate":"enter_1","arrivalTerminal":"3","arrivalTerminalArea":0}}, remapDedupe = input => { const hashMap = new Set(), result = [] for(idx in input){ const {boardingGate, arrivalGate, ...rest} = input[idx], hash = Object.values(rest).join('|') if(hashMap.has(hash)) continue result.push({ boardingGate: 'exit_0', arrivalGate: 'enter_0', ...rest }) hashMap.add(hash) } return {...result} }, result = remapDedupe(src) console.log(result)
 .as-console-wrapper{min-height:100%;}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM