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