1. ホーム
  2. javascript

[解決済み] javascript - 条件で配列要素を削除する

2023-01-16 08:36:14

質問

javascriptで、ある条件をクリアした配列の要素をすべて削除するメソッドを実装したいのですが、どのようにすればよいでしょうか?(できればjQueryを使用せずに)。

ar = [ 1, 2, 3, 4 ];
ar.removeIf( function(item, idx) {
    return item > 3;
});

上記は、配列の各項目を調べて、その中から return true に該当するもの(例では、項目 >3)をすべて削除します。

私はjavascriptを始めたばかりで、これを成し遂げるための短い効率的な方法を知っている人がいればと思っていました。

-- 更新 --

また、この条件がオブジェクトのプロパティにも作用すると最高です。

ar = [ {num:1, str:"a"}, {num:2, str:"b"}, {num:3, str:"c"} ];
ar.removeIf( function(item, idx) {
    return item.str == "c";
});

の場合、項目が削除される場所 item.str == "c"

-- 更新2 --

インデックス条件も機能するといいんですけどね。

ar = [ {num:1, str:"a"}, {num:2, str:"b"}, {num:3, str:"c"} ];
ar.removeIf( function(item, idx) {
    return idx == 2;
});

どのように解決するのですか?

独自のメソッドを Array に独自のメソッドを追加して、似たようなことをすることができます。 filter がうまくいかない場合は

Array.prototype.removeIf = function(callback) {
    var i = 0;
    while (i < this.length) {
        if (callback(this[i], i)) {
            this.splice(i, 1);
        }
        else {
            ++i;
        }
    }
};

私にとって、これはJavaScriptの最もクールな機能の1つです。 Ianは同じことをするために、より効率的な方法を指摘してくれました。それがJavaScriptであることを考慮すると、あらゆることが助けになります。

Array.prototype.removeIf = function(callback) {
    var i = this.length;
    while (i--) {
        if (callback(this[i], i)) {
            this.splice(i, 1);
        }
    }
};

これにより、更新を気にする必要さえもなくなりました。 length を更新したり、次の項目をキャッチしたりすることを気にする必要すらありません。