拼接未从对象数组中删除第一个索引

时间:2018-12-04 16:03:19

标签: javascript arrays angular6 array-splice

我有两个对象数组,我想将第一个数组的对象与第二个数组的对象进行比较。如果它们匹配,则使用splice从第二个数组中删除该对象。

我有以下代码

existing.forEach((existingitem, existingindex, existingfeatures) => {     
  (newdatafeat.features).forEach((newitem, newindex, newfeatures) => { 
    console.log('existing index-name --- new index-name', existingindex ,' - ',existingitem.values_.name,' - ',newindex,' - ',newitem.properties.name,'-----');
    if (existingitem.values_.id == newitem.properties.id &&  existingitem.values_.cat == newitem.properties.cat){              
      console.log(' index to remove - ', newindex); (newdatafeat.features).splice(newindex,1);              
    } 
  })
});   

所以,如果existing

var existing= [
  { info: true, values_:{id:1, cat:true, name : "John"} }, 
  { info : true, values_:{id:2, cat:false, name : "Alice"} }  
];

newdatafeat.features

var newdatafeat= {
   status:scanned,
   features : [  { info: true, properties:{id:1, cat:true, name : "Mike"} }, 
    {  info : false, properties:{id:22, cat:false,name : "Jenny"} }  ]
};

然后,应删除newdatafeat.features中的Mike。

该错误是未删除索引为0的newdatafeat.features数组的每个项目。在循环中,我可以看到index to remove - 0,但是Mike从未被删除。我知道,因为如果循环后我console.log newdatafeat.features,迈克就在那里

这是在angular6代码内。

我在这里想念什么?

谢谢

2 个答案:

答案 0 :(得分:0)

我不得不清理一些代码,但是看起来您的代码工作正常。它确定了一个要删除的元素,称为切片,它消失了。

var existing = [{
    info: true,
    values_: {
      id: 1,
      cat: true,
      name: "John"
    }
  },
  {
    info: true,
    values_: {
      id: 2,
      cat: false,
      name: "Alice"
    }
  }
];


var newdata = {
  status: "scanned",
  features: [
    {
      info: true,
      properties: {
        id: 1,
        cat: true,
        name: "Mike"
      }
    },
    {
      info: false,
      properties: {
        id: 22,
        cat: false,
        name: "Jenny"
      }
    }
  ]
};




existing.forEach(
  (existingitem, existingindex, existingfeatures) => {
    (newdata.features).forEach((newitem, newindex, newfeatures) => {
      console.log('existing index-name --- new index-name', existingindex, ' - ', existingitem.values_.name, ' - ', newindex, ' - ', newitem.properties.name, '-----');

      if (existingitem.values_.id == newitem.properties.id && existingitem.values_.cat == newitem.properties.cat) {
        console.log(' index to remove - ', newindex);
        (newdata.features).splice(newindex, 1);
      }
    })
  });
  
 console.log(newdata.features);

答案 1 :(得分:-1)

这里的主要问题是您要在一个循环中迭代一个数组,但是您要在同一循环中从该数组中删除项。因此索引通常会关闭,并且错误的元素或没有元素将被删除。很难用简单的示例来重现,但是在这里:

function removeVowels(letters) {
  letters.forEach((element, index, arr) => {
    if ('aeiou'.indexOf(element) > -1) {
      arr.splice(index, 1);
    }
  });
}

var myArray = ['a','b','c','d','e'];
removeVowels(myArray);
console.log(myArray);
// works great!

var myArray = ['a','e','c','d','b'];
removeVowels(myArray);
console.log(myArray);
// wtf!

解决此问题的一种简单方法是手动处理循环,如果要删除元素,则手动更改索引。

function removeVowels(letters) {
  for (var i=0; i < letters.length; i++) {
    if ('aeiou'.indexOf(letters[i]) > -1) {
      letters.splice(i, 1);
      i--;
    }
  }
}

var myArray = ['a','b','c','d','e'];
removeVowels(myArray);
console.log(myArray);
// works great!

var myArray = ['a','e','c','d','b'];
removeVowels(myArray);
console.log(myArray);
// hurray!