сплайс не удаляет первый индекс из массива объектов - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть два массива объектов, и я хочу сравнить объекты первого массива с объектами второго массива.Если они совпадают, я использую 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 должен быть удален.

Ошибка в том, что каждый элемент массива newdatafeat.features с индексом 0 не удаляется.В цикле я вижу index to remove - 0, но Майк никогда не удаляется.Я знаю, потому что если я console.log newdatafeat.features после циклов, Майк там

Это внутри кода angular6.

Что мне здесь не хватает?

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Основная проблема здесь заключается в том, что вы итерируете массив в цикле, но вы удаляете элементов из этого массива в том же цикле.Таким образом, индекс часто будет отключен, а неправильный элемент или элемент не будет удален.Это может быть трудно воспроизвести на простых примерах, но здесь вы идете:

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!
0 голосов
/ 04 декабря 2018

Мне пришлось очистить некоторый код, но, похоже, ваш работает нормально.Это идентифицировало один элемент, который будет удален, названный ломтиком, и это ушло.

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);
...