#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' }]