通过比较和推送唯一对象来获得新的对象数组

时间:2015-11-05 10:33:07

标签: javascript

我有2个对象数组excludepeople,我想通过针对exclude属性检查people属性并仅在{{{{}}中添加对象来创建新对象在people中没有功能的1}}。到目前为止,我的尝试有点疯狂,并想知道是否有人可以帮助改善一些事情或提供更好的解决方案?

小提琴 More here

JS

exclude

3 个答案:

答案 0 :(得分:1)

您重复了一些JSON.stringify来电 您可以将数组转换为JSON一次,然后重复使用它。此外,您可以将push替换为Array.prototype.filter

var excludeJson = exclude.map(JSON.stringify);

peopleArr = peopleArr.filter(function(x) { 
    return excludeJson.indexOf(JSON.stringify(x)) === -1;
});

以下是工作片段:



var exclude = [{
    id: 1,
    name: 'John'
}];

var peopleArr = [{
    id: 1,
    name: 'John'
}, {
    id: 2,
    name: 'James'
}, {
    id: 3,
    name: 'Simon'
}];

var excludeJson = exclude.map(JSON.stringify);

peopleArr = peopleArr.filter(function(x) { 
  return excludeJson.indexOf(JSON.stringify(x)) === -1;
});

document.body.innerText = JSON.stringify(peopleArr);




答案 1 :(得分:1)

这可以通过.filter.findIndex

来实现
var myObj = peopleArr.filter(function(person){
   var idx = exclude.findIndex(function(exc) { return person.id == exc.id && person.name == exc.name; });
   return idx == -1; // means current person not found in the exclude list
});

我已经明确地将实际属性与原始属性进行了比较,您比较字符串化版本的原始方式没有什么特别的错误(JSON.stringify(e) == JSON.stringify(x)可以在我的示例中使用)

答案 2 :(得分:1)

假设exclude可以包含多个项目,我会使用filter()forEach()的组合:

var newArray = peopleArr.filter(function(person) {
    include = true;
    exclude.forEach(function(exl) {
        if (JSON.stringify(exl) == JSON.stringify(person)) {
            include = false;
            return;
        }
    })
    if (include) return person;
})
分叉小提琴 - >的 http://jsfiddle.net/6c24rte8/