基于JavaScript中的另一个列表更新列表

时间:2017-07-09 17:18:14

标签: javascript arrays json object

如何根据其他阵列更新阵列?

这就是我试图做的事情:



   
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;
&#13;
&#13; 此循环导致错误,因为每次迭代后长度都在变化。

我想要的是,添加elem object中的每个元素,如果它不存在于arr object中,当然保持 JOSN 格式。在我的例子中,它不必改变。

2 个答案:

答案 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

如果您的识别密钥是其他内容,例如组合nametitle,则调整上一个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);