首頁  >  文章  >  web前端  >  如何在 JavaScript 中根據屬性有效率地從陣列中刪除物件?

如何在 JavaScript 中根據屬性有效率地從陣列中刪除物件?

Barbara Streisand
Barbara Streisand原創
2024-10-30 08:59:39458瀏覽

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