从数组中删除重复的对象

时间:2017-09-21 11:54:09

标签: javascript arrays object

我试图从数组中删除重复的对象。我尝试过使用套装和使用for循环。为什么这些解决方案都不起作用?

var array = [
  {"title": "Assistant"},
  {"month": "July"},
  {"event": "Holiday"},
  {"title": "Assistant"}
];

var set = new Set(array);
console.log(set);

let newArray = [];
for(var i = 0; i < array.length; i++){
    if(newArray.indexOf(array[i]) === -1){
    newArray.push(array[i])
  }
}
console.log(newArray); 

jsfiddle:https://jsfiddle.net/7uzucqj5/

4 个答案:

答案 0 :(得分:1)

您可以使用字符串化对象作为集合的值并使用它进行过滤。

对于具有多个具有不同顺序的属性的对象,它可能无效。

&#13;
&#13;
var array = [{ title: "Assistant" }, { month: "July" }, { event: "Holiday" }, { title: "Assistant"  }],
    hash = new Set,
    unique = array.filter(o => !hash.has(JSON.stringify(o)) && hash.add(JSON.stringify(o)));
  
console.log(unique);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 1 :(得分:1)

像这样更改你的代码,如果你有不同顺序的相同元素也可以。

var arr = [
  {"title": "Assistant","name":"myname"},
  {"month": "July"},
  {"event": "Holiday"},
  {"name":"myname","title": "Assistant"}
];
var newArr = [];
var temp = [];
for(var i in arr){
  var str = JSON.stringify(sort(arr[i]));
  if(temp.indexOf(str)){
    temp.push(str);
    newArr.push(arr[i]);
  }
}

function sort(unordered){
const ordered = {};
Object.keys(unordered).sort().forEach(function(key) {
  ordered[key] = unordered[key];
});
return ordered;
}
console.log(newArr);

答案 2 :(得分:0)

使用lodash执行此操作的简单而有效的方法是:

_.uniqWith(array, _.isEqual);

这将比较数组中的对象以查找重复项并返回唯一对象数组。 它已经过测试,可以在此jsfiddle上查看。

答案 3 :(得分:0)

您可以尝试以简单的方式使用Setmap()函数

var array = [
  {"title": "Assistant"},
  {"month": "July"},
  {"event": "Holiday"},
  {"title": "Assistant"}
];
let output4 = [...new Set(array.map(s => JSON.stringify(s)))]
    .map(s => JSON.parse(s));
console.log(output4);