首页  >  文章  >  web前端  >  如何在 JavaScript 中根据属性高效地从数组中删除对象?

如何在 JavaScript 中根据属性高效地从数组中删除对象?

Barbara Streisand
Barbara Streisand原创
2024-10-30 08:59:39456浏览

How to Efficiently Remove Objects from an Array Based on Properties in JavaScript?

使用本机 JavaScript 通过对象属性从数组中删除对象

使用对象数组时,可以根据属性删除特定对象基本的。然而,由于数组长度递减,简单地使用 splice() 可能会导致复杂化。以下是如何使用本机 JavaScript 技术克服此问题:

删除后递减 i:

要通过拼接修复问题,请在每次删除后递减 i 以考虑到移位索引。这可以防止跳过数组元素并确保删除所有目标对象。

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

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

重写数组元素:

为了避免线性时间删除,您可以仅重写您想要保留在数组上的元素。

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;

使用哈希集:

为了更快地查找,请使用哈希集来存储 ID要删除的对象。

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

以上是如何在 JavaScript 中根据属性高效地从数组中删除对象?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn