array. filter()从数组中删除所有元素.有时



我快疯了。期望的结果是newArray返回除了两个id匹配的元素之外的所有元素——这在代码中进行了概述。当我向数组中添加对象,然后尝试逐个删除它们时,如果顺序完全颠倒,则每次取出一个元素。如果我选择一个先添加的项,它会将它们全部删除。

数组中的示例对象-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]
})
}

我认为这是你想要的逻辑:

  • 检查对象是否已经存在于数组中,如果存在则删除。

  • 如果不存在,添加

可以通过以下方式实现:

  • 调用findIndex()查找与id匹配的对象。如果找到匹配,则返回index,否则返回-1,如果找到匹配,则使用splice(index, 1)删除它。

  • else,如果findIndex()返回-1(这里通过使用位NOT~将-1强制为零来检查),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' }]

最新更新