Array.filter() удаление всех элементов из массива … иногда

#javascript #arrays #reactjs

#javascript #массивы #reactjs

Вопрос:

Это сводит меня с ума. Желаемый результат состоит в том newArray , чтобы вернуть все, кроме элемента, в котором id совпадают два s — это изложено в коде. Когда я добавляю объекты в массив, а затем пытаюсь удалить их один за другим, если порядок в точности обратный, элементы выходят по одному. Если я выбираю элемент, который был добавлен первым, он удаляет их все.

Образец объекта в массиве — id уникален и является int:

 let newgeom = {
  id: geom.properties.ogc_fid,
  geom: geom
}
 

Код для удаления таков — возможно, есть лучший способ, но цель состояла в том, чтобы посмотреть, был ли элемент там, id а затем удалить.

 let newgeom = {
  id: geom.properties.ogc_fid,
  geom: geom
}

let filteredArray = reportGeoJSON.filter(function( obj ) {
  return obj.id === newgeom.id;
});

if(filteredArray.length > 0) {
  console.log('removing poly')
  let newArray = reportGeoJSON.filter(function( obj ) {
    return obj.id !== newgeom.id;
  });
  setReportGeoJSON(newArray)
} else {
  setReportGeoJSON(oldArray => {
    return [...oldArray, newgeom]
  })
}
 

Комментарии:

1. возврат obj.id !== newgeom.id ;, очень вероятно, что это условие становится истинным, потому что строка, int equality совпадают, можете ли вы подтвердить?

2. Конечно, если найдено существующее совпадение, вы просто не должны ничего делать; т. Е. Не добавляйте новый объект в массив. И ваше текущее удаление — это просто поиск всех существующих записей, идентификатор которых не равен новому, и использование его в качестве нового массива, поэтому неудивительно, что вы теряете записи в нем.

Ответ №1:

Следуя тому, что я считаю вашей предполагаемой логикой:

  • проверьте, существует ли объект уже в массиве, если да, удалите его.
  • если он не существует, добавьте его.

что может быть достигнуто с помощью следующих действий:

  • вызовите findIndex() поиск объекта с совпадением id . Это вернет index значение, если совпадение найдено, в противном случае -1, если совпадение было найдено, удалите его с помощью splice(index, 1) .
  • в противном случае, если findIndex() возвращается -1 (здесь проверяется с помощью побитового НЕ ~ принуждать -1 к 0, что равно нулю), push() новый объект.
 const
  reportGeoJSON = [{ id: 1, geom: 'geom1' }, { id: 2, geom: 'geom2' }, { id: 3, geom: 'geom3' }],
  setReportGeoJSON = (arr) => console.log(arr);

function addNewGeom(newGeom) {
  const
    newArr = [...reportGeoJSON],
    matchIndex = reportGeoJSON.findIndex(o => o.id === newGeom.id);

  if (~matchIndex) {
    newArr.splice(matchIndex, 1);
  } else {
    newArr.push({ ...newGeom })
  }
  setReportGeoJSON(newArr);
};

addNewGeom({ id: 3, geom: 'geom' });
//[ { id: 1, geom: 'geom1' }, { id: 2, geom: 'geom2' } ]

addNewGeom({ id: 5, geom: 'geom' })
// [{ id: 1, geom: 'geom1' }, { id: 2, geom: 'geom2' }, { id: 3, geom: 'geom3' }, { id: 5, geom: 'geom' }]