首页 > 解决方案 > 根据多个属性从对象数组中过滤重复项,包括原始值

问题描述

data是一个对象列表。我们希望根据多个对象属性过滤掉所有重复项,包括原始值。

我的代码可以根据多个对象属性过滤掉重复项,但是我们如何调整它以过滤掉原始值呢?

目标是最终得到这些重复项的列表。

const data = [{
  name: 'x',
  latitude: '45.9',
  longitude: '50.2'
}, {
  name: 'y',
  latitude: '45.9',
  longitude: '50.2'
}, {
  name: 'z',
  latitude: '40.5',
  longitude: '85.7'
}];

const duplicates = data
  .filter((obj, index, array) =>
    array.findIndex(o =>
      o.latitude === obj.latitude &&
      o.longitude === obj.longitude
    ) != index
  );

console.log(duplicates);

输出:

[{
  name: 'y',
  latitude: '45.9',
  longitude: '50.2'
}]

期望的输出:

[{
  name: 'x',
  latitude: '45.9',
  longitude: '50.2'
}, {
  name: 'y',
  latitude: '45.9',
  longitude: '50.2'
}]

标签: javascriptarraysalgorithmfilterjavascript-objects

解决方案


而不是findIndex,您可以运行一个带有额外条件的 forloop ,即 index 不应与您正在检查的索引相同

基于此,您可以直接从循环内部返回。

var data = [
    { name: 'x',
        latitude: '45.9',
      longitude: '50.2'},
    { name: 'y',
        latitude: '45.9',
      longitude: '50.2'},
    { name: 'z',
        latitude: '40.5',
      longitude: '85.7'},
];

var duplicates = data.filter((obj, index, array) => {
  for(let i = 0 ; i < array.length;i++){
  if(i!=index && array[i].latitude == obj.latitude 
    && array[i].longitude == obj.longitude ){
      return true;
    }
  }
  return false;    
});
    
    

console.log(duplicates);


推荐阅读