删除对象数组中的重复元素Javascript [关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除对象数组中的重复元素Javascript [关闭]相关的知识,希望对你有一定的参考价值。

基本上我想知道如何在javascript中清理对象数组。

我已经看到一些样本显示如何根据一个元素的值进行操作,我需要它是通用的。这意味着它不依赖于孩子的名字。

Example of the way i don't want

我需要的是一个可以独立于对象结构工作的函数。

例如,它可以用于此:

object = [
    {value: 'value', configuration: 'configuration'},
    {value: 'value2', configuration: 'configuration2'},
    {value: 'value', configuration: 'configuration'},
]

//returning:

object = {
    {value: 'value', configuration: 'configuration'},
    {value: 'value2', configuration: 'configuration2'}
}

它也可以用于:

object = [
    {name: 'name', property: 'property'},
    {name: 'name2', property: 'property2'},
    {name: 'name', property: 'property'},
]

//returning:

object = [
    {name: 'name', property: 'property'},
    {name: 'name2', property: 'property2'}
]
答案

使用filter / findIndex技巧对数组进行重复数据删除很简单,唯一的问题是我们需要使用相等函数来比较元素。对于对象,一个简单的===将无法正常工作。

这是一个使用基本浅等于比较器的简单示例。它只检查两个对象对于相同的键具有相同的值,这将适用于示例中的对象(但它不适用于嵌套对象)。根据您的使用情况而定可能还不够。另一个不错的选择是lodash的_.isEqual方法,或者比较它们的JSON字符串的函数。重要的是您定义了一个函数来比较满足您要求的两个对象。

var array1 = [
    {value: 'value', configuration: 'configuration'},
    {value: 'value2', configuration: 'configuration2'},
    {value: 'value', configuration: 'configuration'},
];

var array2 = [
    {name: 'name', property: 'property'},
    {name: 'name2', property: 'property2'},
    {name: 'name', property: 'property'},
];

// You need to define an equality function to use with the deduplicator. Heres a basic one.
function isKVEqual(obj1, obj2) {
  // Get the keys of these objects, make sure they have the same number of keys.
  const o1keys = Object.keys(obj1);
  const o2keys = Object.keys(obj2);
  if (o1keys.length !== o2keys.length) return false;
  
  // Check that the value of each key is the same in each object.
  for (const key of o1keys) {
    if (obj2[key] !== obj1[key]) return false;
  }
  
  return true;
}

// Deduplicate:
// Make sure to replace the isKVEqual call with whatever custom comparator you want to use.
const dedupedArray1 = array1.filter((item, index, list) => list.findIndex(x => isKVEqual(x, item)) === index);
const dedupedArray2 = array2.filter((item, index, list) => list.findIndex(x => isKVEqual(x, item)) === index);

console.log(dedupedArray1)
console.log(dedupedArray2)
另一答案

如果您愿意使用外部库,我建议使用lodash来检查这两个项是否重复,并以这种方式过滤:

let object = [
    {name: 'name', property: 'property'},
    {name: 'name2', property: 'property2'},
    {name: 'name', property: 'property'},
]

function removeDuplicates(arr) {
  return arr.filter((elem, idx) => {
    return !arr.slice(idx + 1).find((other) => _.isEqual(elem, other));
  });
}

console.log(removeDuplicates(object));
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js"></script>
另一答案

您可以使用filter和json进行通用检查

var list = [
    {value: 'value', configuration: 'configuration'},
    {value: 'value2', configuration: 'configuration2'},
    {value: 'value', configuration: 'configuration'},
];
//filter element
list = list.filter(function(value, index){
  var exists = false;
  //verify if exists the same element with other index before
  for(var i in list){
    //generic verify the json
    if(JSON.stringify(list[i]) ==         JSON.stringify(list[index]) && i < index){            exists = true; 
       break;
    }
  }  
  //if dont exists dont filter
  return !exists;
});

console.log(list);

以上是关于删除对象数组中的重复元素Javascript [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

javascript更改数组中的元素[重复]

使用支持 IE8 的 JavaScript 中的值从数组中删除一个元素 [重复]

如何在 JavaScript 中迭代数组并删除元素 [重复]

javascript 从javascript中的对象数组中删除重复项

javascript删除数组/对象中的元素

javascript中,知道一个值,如何删除数组中的这个值的元素。