【问题标题】:Set same value of given property for all objects within array and eliminate duplicates为数组中的所有对象设置相同的给定属性值并消除重复项
【发布时间】:2020-04-28 08:52:01
【问题描述】:

我有这个对象:

{
  "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”。一旦更改,我需要删除那些提供相同对象结构的对象。 我正在寻找的最终结果对象如下:

{
  "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) => {

              });
            }
        });
      });

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

【问题讨论】:

  • 我已经尝试使用 forEach 获取 Object.values(data),你能分享一下失败的尝试吗?

标签: javascript arrays object foreach javascript-objects


【解决方案1】:

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

最后从数组中创建一个对象。

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; }

【讨论】:

  • 完美运行!!现在轮到我理解了!!非常感谢
【解决方案2】:

您的代码有两个问题:

  • 次要的(您的输入和预期的 由于重复terminalArea 键,对象无效)
  • 和主要的一个 - 你的尝试和接受的答案都在实现 O(n²) 时间算法(由于嵌套循环),如果你的输入足够大,这可能会导致巨大的性能损失 (up to 90% slower compared to O(n)-time algorithm for 1k items)李>

所以,如果您仍然考虑更全面(而且更重要的是快速),请查看以下方法:

  • 构建包含输入对象值的唯一组合的哈希映射
  • 如果哈希映射中缺少其哈希值,则推送重新映射的对象(统一值为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%;}

【讨论】:

    猜你喜欢
    • 2018-10-19
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    相关资源
    最近更新 更多