【问题标题】:Comparing arrays of objects and remove duplicate [duplicate]比较对象数组并删除重复的[重复]
【发布时间】:2023-03-15 09:16:01
【问题描述】:

我有一个包含对象数组的数组,我需要比较它。

我已经查看了多个类似的线程,但我找不到一个合适的比较 多个 对象数组(大多数是比较两个对象数组或只是比较对象在单个数组中)

这是数据(下面是带有代码示例的 JSFiddle)

const data = [  
  [  
    {  
      "id": "65",
      "name": "Some object name",
      "value": 90
    },
    {  
      "id": "89",
      "name": "Second Item",
      "value": 20
    }
  ],
  [  
    {  
      "id": "89",
      "name": "Second Item",
      "value": 20
    },
    {  
      "id": "65",
      "name": "Some object name",
      "value": 90
    }
  ],
  [  
    {  
      "id": "14",
      "name": "Third one",
      "value": 10
    }
  ]
]

我想删除所有重复的对象数组,无论data 的长度如何(可能还有更多记录)。

我设法将唯一的提取到一个对象中:

const unique = data.reduce(function(result, obj) {
    return Object.assign(result, obj)
}, [])

但这对我不起作用,因为我需要保留 1 个重复的数组,并且返回的数据也是一个数组,而不是一个对象。例如:

// result I need
[  
  [  
    {  
      "id":"65",
      "name":"Some object name",
      "value":90
    },
    {  
      "id":"89",
      "name":"Second Item",
      "value":20
    }
  ],
  [  
    {  
      "id":"14",
      "name":"Third one",
      "value":10
    }
  ]
]

那么,如何将每个对象数组与父数组中的其他对象进行比较,并保留每个重复或唯一的对象数组之一?

JSFiddle

【问题讨论】:

  • 搜索对象副本的概念保持不变,无论是在一个数组还是多个数组中搜索。
  • 事实上看起来更复杂,否则我现在可能已经完成了基于 simply 过滤单个数组中重复对象的数百个答案.您链接的问题也是如此,它不能满足这个用例。
  • 我不确定这是不是链接的副本,因为内部数组似乎是有序的,因此需要先对它们进行排序,然后才能进行比较。我已经使用一些 lodash 函数组合了一个解决方案 - uniqWith 和 sortBy: jsbin.com/terelef/2/edit?js,console

标签: javascript arrays reactjs


【解决方案1】:

您可以通过使用函数来实现。如下所示。不确定这样做的最佳最佳方式。

var testArray = [  
  [  
    {  
      "id": "65",
      "name": "Some object name",
      "value": 90
    },
    {  
      "id": "89",
      "name": "Second Item",
      "value": 20
    }
  ],
  [  
    {  
      "id": "89",
      "name": "Second Item",
      "value": 20
    },
    {  
      "id": "65",
      "name": "Some object name",
      "value": 90
    }
  ],
  [  
    {  
      "id": "14",
      "name": "Third one",
      "value": 10
    }
  ]
]

function removeDuplicatesFromArray(arr){

 var obj={};
 var uniqueArr=[];
 for(var i=0;i<arr.length;i++){ 
    if(!obj.hasOwnProperty(arr[i])){
        obj[arr[i]] = arr[i];
        uniqueArr.push(arr[i]);
    }
 }

return uniqueArr;

}
var newArr = removeDuplicatesFromArray(testArray);
console.log(newArr);

【讨论】:

  • 代码不适用于这种数据:jsfiddle.net/9xdfdnsy 它返回一个数组而不是两个单独的数组。
【解决方案2】:

const data = [  
  [  
    {  
      "id": "65",
      "name": "Some object name",
      "value": 90
    },
    {  
      "id": "89",
      "name": "Second Item",
      "value": 20
    }
  ],
  [  
    {  
      "id": "89",
      "name": "Second Item",
      "value": 20
    },
    {  
      "id": "65",
      "name": "Some object name",
      "value": 90
    }
  ],
  [  
    {  
      "id": "14",
      "name": "Third one",
      "value": 10
    }
  ]
];

const temp = {};
const result = [];

data.forEach(itemArr => {
  const items = itemArr.filter(item => {
    const isUnique = temp[`${item.id}-${item.name}-${item.value}`] === undefined;
    
    temp[`${item.id}-${item.name}-${item.value}`] = true;
    return isUnique;
  });
  if (items.length !== 0)
    result.push(items);
});

console.log(result);

【讨论】:

  • 我不能接受的唯一原因是如果有另一个数组包含不同的对象,但其中一个对象是从另一个对象数组复制的,那么它将被删除。
  • 我不这么认为。可能是我不清楚你的问题。无论如何,我猜@manikant gautam 的解决方案有效。
  • 嗯,我的意思是这样的:jsfiddle.net/efag61se 结果应该有 2 个包含 2 个对象的数组和 1 个包含 3 个对象的数组。
猜你喜欢
  • 1970-01-01
  • 2021-06-19
  • 2021-05-09
  • 2020-05-11
  • 2014-12-16
  • 2017-12-31
  • 2016-11-10
  • 2020-10-16
  • 2020-05-08
相关资源
最近更新 更多