简体   繁体   English

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

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

I have this object of objects:我有这个 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
  }
}

I need to change all "boardingGate" values to "exit_0" and all "arrivalGate" values to "enter_0".我需要将所有“boardingGate”值更改为“exit_0”,将所有“arrivalGate”值更改为“enter_0”。 And once changed I need to remove the ones that give an equal object structure.一旦更改,我需要删除那些提供相同 object 结构的结构。 The final resultant object I'm looking for would be the following:我正在寻找的最终结果 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
  }
}

Eliminating in this case one of the first two that would obtain as final result the same data.在这种情况下,消除将获得最终结果相同数据的前两个之一。 I have tried with a forEach obtaining the Object.values(data) and I don't get the desired results... and I don't know if there would be an easier way either.我已经尝试使用 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) => {

              });
            }
        });
      });

Thank you very much for your help in advance非常感谢您提前提供的帮助

You could get the entries, reduce the array by looking to the wanted vommon entries and add for unknown key/value pairs a new data set with updated properties.您可以获取条目,通过查看所需的 vommon 条目来减少数组,并为未知的键/值对添加具有更新属性的新数据集。

Finally create an object from the array.最后从数组中创建一个 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; }

There are two concerns regarding your code:您的代码有两个问题:

  • the minor one (both of your input and expected objects are invalid due to duplicating terminalArea key)次要的(由于重复terminalArea键,您的输入和预期对象均无效)
  • and the major one - both of your attempt and accepted answer are implementing O(n²)-time algorithms (due to nested loops) which may cause huge performance loss ( up to 90% slower compared to O(n)-time algorithm for 1k items ), should your input be large enough主要的一个-您的尝试和接受的答案都在实现 O(n²) 时间算法(由于嵌套循环),这可能会导致巨大的性能损失(与 1k 的 O(n) 时间算法相比,速度降低多达 90% items ),如果您的输入足够大

So, if you still consider something more comprehensive (and, what's more important, fast), please check out the following approach:因此,如果您仍然考虑更全面的东西(更重要的是,快速),请查看以下方法:

  • build up a hash map that contains unique combination of input object values建立一个包含输入 object 值的唯一组合的 hash map
  • push remapped object (with uniformed values of boardingGate / arrivalGate ) if its hash is missing from the hashmap如果 hashmap 中缺少 hash,则推送重新映射的 object(具有统一值boardingGate / arrivalGate

The proof of a concept is as follows:一个概念的证明如下:

 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.

相关问题 在对象数组中的属性中查找具有最大值的所有对象,并从同一对象返回其他属性的值 - Finding all objects with Max value in a property within an Array of Objects and return values of other property from the same object 比较数组中的对象,合并具有相同属性值的重复项,将属性值添加到合并的对象中 - Compare objects in array, merge duplicates with same property value, add property values to the merged object 我将如何防止对象数组中的重复项? 如果有一个具有相同属性的对象,它应该求和它的值 - How would I prevent duplicates in array of objects? And if there is a object with same property, it should sume its value 如何将具有相同属性名称的对象数组转换为从给定数组中的值连接值的对象? JS - How to transform an array of objects with the same property name into the object in which value is concatenated from values in a given array? JS 在数组中动态共享或共享给定属性名称和值的对象 - Dynamically group or filter objects within an array that share a given property name and value JavaScript:删除共享相同属性值的对象的重复项 - JavaScript: Remove duplicates of objects sharing same property value 检查对象数组中的所有属性值是否相同 - Check if all property values are the same in an Array of Objects 计算对象数组中的重复项 - Count duplicates within an Array of Objects 在嵌套对象数组中按属性值对对象数组进行排序 - Sort array of objects by property value within nested array of objects 在数组中查找具有相同值属性的对象 - Find objects in array with same value property
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM