ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript のプロパティに基づいて配列からオブジェクトを効率的に削除する方法

JavaScript のプロパティに基づいて配列からオブジェクトを効率的に削除する方法

Barbara Streisand
Barbara Streisandオリジナル
2024-10-30 08:59:39529ブラウズ

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。