为数组中的所有对象设置相同的属性值,消除重复。

问题描述 投票:0回答:1

我有这个对象的对象。

{
  "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
  }
}

我需要把所有登机口的值改成exit_0,把所有到达口的值改成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) => {

              });
            }
        });
      });

非常感谢您的帮助,提前

javascript object foreach javascript-objects
1个回答
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; }

1
投票

关于你的代码有两个问题。

  • 较小的问题(你的输入对象和预期对象由于重复而无效) terminalArea 钥匙)
  • 最主要的是--你的尝试和被接受的答案都是实现了O(n²)时间的算法(由于嵌套循环),这可能会造成巨大的性能损失(与1k个项目的O(n)时间算法相比,最多可以慢90%。),如果你的输入足够大

所以,如果你还在考虑一些更全面的东西(更重要的是,快速),请看看下面的方法。

  • 建立一个包含输入对象值的唯一组合的哈希图。
  • 推送重映射对象(统一为 boardingGatearrivalGate),如果它的哈希值在哈希图中缺失的话

一个概念的证明如下。

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%;}
© www.soinside.com 2019 - 2024. All rights reserved.