簡體   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