javascript - 按对象属性从数组中删除对象

标签 javascript

var listToDelete = ['abc', 'efg'];

var arrayOfObjects = [{id:'abc',name:'oh'}, // delete me
                      {id:'efg',name:'em'}, // delete me
                      {id:'hij',name:'ge'}] // all that should remain

如何通过匹配对象属性从数组中删除对象?

请仅使用 native JavaScript。

我在使用拼接时遇到问题,因为长度会随着每次删除而减少。 在原始索引上使用克隆和拼接仍然会给您带来长度减少的问题。

最佳答案

我假设你使用了 splice 这样的东西?

for (var i = 0; i < arrayOfObjects.length; i++) {
    var obj = arrayOfObjects[i];

    if (listToDelete.indexOf(obj.id) !== -1) {
        arrayOfObjects.splice(i, 1);
    }
}

修复错误所需要做的就是在下一次递减 i,然后(向后循环也是一种选择):

for (var i = 0; i < arrayOfObjects.length; i++) {
    var obj = arrayOfObjects[i];

    if (listToDelete.indexOf(obj.id) !== -1) {
        arrayOfObjects.splice(i, 1);
        <b>i--;</b>
    }
}

为避免线性时间删除,您可以在数组上写入要保留的数组元素:

var end = 0;

for (var i = 0; i < arrayOfObjects.length; i++) {
    var obj = arrayOfObjects[i];

    if (listToDelete.indexOf(obj.id) === -1) {
        arrayOfObjects[end++] = obj;
    }
}

arrayOfObjects.length = end;

为了避免在现代运行时进行线性时间查找,您可以使用哈希集:

const setToDelete = new Set(listToDelete);
let end = 0;

for (let i = 0; i < arrayOfObjects.length; i++) {
    const obj = arrayOfObjects[i];

    if (setToDelete.has(obj.id)) {
        arrayOfObjects[end++] = obj;
    }
}

arrayOfObjects.length = end;

可以用一个很好的函数来包装:

const filterInPlace = (array, predicate) => {
    let end = 0;

    for (let i = 0; i < array.length; i++) {
        const obj = array[i];

        if (predicate(obj)) {
            array[end++] = obj;
        }
    }

    array.length = end;
};

const toDelete = new Set(['abc', 'efg']);

const arrayOfObjects = [{id: 'abc', name: 'oh'},
                        {id: 'efg', name: 'em'},
                        {id: 'hij', name: 'ge'}];

filterInPlace(arrayOfObjects, obj => !toDelete.has(obj.id));
console.log(arrayOfObjects);

如果不需要原地做,那就是Array#filter:

const toDelete = new Set(['abc', 'efg']);
const newArray = arrayOfObjects.filter(obj => !toDelete.has(obj.id));

关于javascript - 按对象属性从数组中删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16491758/

相关文章:

javascript - 使用 Angular 2 接口(interface)

javascript - 如果用户使用的是 IE 9 及更低版本,则使用 jQuery 显示 div

javascript - 使用 jquery 删除 html 中的样式标签

javascript - children 如何收听/捕捉 parent 的事件

javascript - Three.js 阴影不起作用

javascript - 如何在 javascript/jquery 中获取选中的复选框标题值?

javascript - es6中缓存方法调用结果

javascript - 在javascript中查找具有相同自定义属性的元素数量

javascript - 当 "onChange"已为不同功能保留时,如何避免在 react 输入字段中使用空格?

javascript - 使用 JavaScript 更改 <a-box> 的 src