如何根据其他阵列更新阵列?
这就是我试图做的事情:
var ref = [
{
"name": "Jack",
"title": "Manager",
"description": "",
},
{
"name": "Steve",
"title": "CEO",
"description": "A test description",
}
];
var elem = [
{
"name": "Jack",
"title": "Manager",
"description": "",
},
{
"name": "Steve",
"title": "CEO",
"description": "A test description",
}
];
for (var i = 0; i < ref.length; i++) {
ref.indexOf(elem[i]) === -1 ? ref.push(elem[i]) : console.log("This item already exists");
}
console.log(ref);
console.log(elem);
&#13;
我想要的是,添加elem object
中的每个元素,如果它不存在于arr object
中,当然保持 JOSN 格式。在我的例子中,它不必改变。
答案 0 :(得分:1)
最好在elem
上运行循环。你也无法比较这样的对象,因为引用会有所不同,所以你必须做深度检查,这样的事情应该有效:
var ref = [
{
"name": "Jack",
"title": "Manager",
"description": "",
},
{
"name": "Steve",
"title": "CEO",
"description": "A test description",
}
];
var elem = [
{
"name": "Jack",
"title": "Manager",
"description": "",
},
{
"name": "Steve",
"title": "CEO",
"description": "A test description",
}
];
for (var i = 0; i < elem.length; i++) {
var found = false;
for (var j=0; j<ref.length; j++){
var count = Object.keys(elem[i]).length;
for(var key in elem[i]){
if(ref[j][key] === elem[i][key])
count--;
}
if (count === 0){
found= true;
break;
}
}
if (!found)
ref.push(elem[i]);
}
console.log(ref);
console.log(elem);
答案 1 :(得分:1)
为避免嵌套循环,您可以使用Set
中的每个密钥构建ref
。假设您认为该名称是识别密钥,那么它将如下所示:
ref = ref.concat(elem.filter(function (o) {
return !this.has(o.name)
}, new Set(ref.map(o => o.name))));
因此,通过获取Set
中的所有名称构建ref
,将其作为this
传递给filter
回调,该回调会检查每个elem
输入是否有集合中的name
。如果是,则由filter
排除。此筛选结果将连接到ref
。
如果您的识别密钥是其他内容,例如组合name
和title
,则调整上一个map(.......)
中使用的函数,并在{{中应用相同的逻辑1}}。
以下是使用has()
和name
组合作为识别键的小提琴(略有不同的样本数据):
title
var ref = [{
"name": "Jack",
"title": "Manager",
"description": "",
}, {
"name": "Steve",
"title": "CEO",
"description": "A test description",
}];
var elem = [{
"name": "Jack",
"title": "Manager",
"description": "",
}, {
"name": "Steve",
"title": "Programmer",
"description": "Java addict",
}];
ref = ref.concat(elem.filter(function (o) {
return !this.has(JSON.stringify([o.name, o.title]))
}, new Set(ref.map(o => JSON.stringify([o.name, o.title])))));
console.log(ref);