web-dev-qa-db-ja.com

UnderscoreJSを使用して配列から項目を削除する

このコードがあるとしましょう

 var arr = [{id:1、名前: 'a'}、{id:2、名前: 'b'}、{id:3、名前: 'c'}]; 

そして、私は配列からid = 3のアイテムを削除したいです。接合せずにこれを行う方法はありますか?アンダースコアを使用しているもの、またはそのようなものがありますか。

ありがとうございます。

131
climboid

単純なJavaScriptを使用して、これはすでに答えられています: オブジェクトプロパティによって配列からオブジェクトを削除します

Underscore.jsを使用すると、 .findWhere.without を組み合わせることができます。

var arr = [{
  id: 1,
  name: 'a'
}, {
  id: 2,
  name: 'b'
}, {
  id: 3,
  name: 'c'
}];

//substract third
arr = _.without(arr, _.findWhere(arr, {
  id: 3
}));
console.log(arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

とはいえ、この場合は新しい配列を作成しているので、_.filterまたはネイティブのArray.prototype.filter関数を使用することができます(他の質問で示したように)。それなら、このように潜在的に2回ではなく、1回だけ配列を反復処理します。

配列をインプレースに変更したい場合は、.spliceを使用する必要があります。これは他の質問でも示されており、Unscoreはそのための便利な機能を提供していないようです。

264
Felix Kling

アンダースコア .filter を使用できます

    var arr = [{
      id: 1,
      name: 'a'
    }, {
      id: 2,
      name: 'b'
    }, {
      id: 3,
      name: 'c'
    }];

    var filtered = _(arr).filter(function(item) {
         return item.id !== 3
    });

次のように書くこともできます。

var filtered = arr.filter(function(item) {
    return item.id !== 3
});

var filtered = _.filter(arr, function(item) {
    return item.id !== 3
});

フィドルをチェック

.reject を使用することもできます

94
Sushanth --

アンダースコアを使用する _.reject()

arr = _.reject(arr, function(d){ return d.id === 3; });
38
greenafrican

アンダースコアには、特に削除するオブジェクトがある場合に、配列から項目を削除するのに最適な _ without() メソッドがあります。

値のすべてのインスタンスを削除した配列のコピーを返します。

_.without(["bob", "sam", "fred"], "sam");

=> ["bob", "fred"]

より複雑なオブジェクトでも動作します。

var bob = { Name: "Bob", Age: 35 };
var sam = { Name: "Sam", Age: 19 };
var fred = { Name: "Fred", Age: 50 };

var people = [bob, sam, fred]

_.without(people, sam);

=> [{ Name: "Bob", Age: 35 }, { Name: "Fred", Age: 50 }];

削除するアイテムがない場合は、そのプロパティだけで、_.findWhereを使用してから_.withoutを使用できます。

15
PeteGO

文字列をフィルタリングし、大文字と小文字を区別しないフィルタを探している場合は注意してください。 _.without()は大文字と小文字を区別します。以下のように_.reject()を使うこともできます。

var arr = ["test","test1","test2"];

var filtered = _.filter(arr, function(arrItem) {
    return arrItem.toLowerCase() !== "TEST".toLowerCase();
});
console.log(filtered);
// ["test1", "test2"]

var filtered1 = _.without(arr,"TEST");
console.log(filtered1);
// ["test", "test1", "test2"]

var filtered2 = _.reject(arr, function(arrItem){ 
    return arrItem.toLowerCase() === "TEST".toLowerCase();
});
console.log(filtered2);
// ["test1", "test2"]
5

あなたが使用できる場所でアレイを変更したい場合、他の答えはアレイの新しいコピーを作成します。

arr.splice(_.findIndex(arr, { id: 3 }), 1);

しかし、これは要素が常に配列の中に見つかると仮定しています(見つからなかった場合は最後の要素を削除します)。安全のためにあなたが使用することができます:

var index = _.findIndex(arr, { id: 3 });
if (index > -1) {
    arr.splice(index, 1);
}
3
Sajjad Shirazy

普通のJavaScriptArray#filter メソッドを使うことができます。

var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];

var filteredArr = arr.filter(obj => obj.id != 3);

console.log(filteredArr);

または、 Array#reduce および Array#concat のようなメソッドを使用します。

var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];

var reducedArr = arr.reduce((accumulator, currObj) => {
  return (currObj.id != 3) ? accumulator.concat(currObj) : accumulator;
}, []);

console.log(reducedArr);

注意:

  • これらは両方とも純粋な機能的アプローチです(、つまり既存の配列は変更されません)。
  • いいえ、これらのアプローチでは外部ライブラリが必要です(Vanilla JavaScriptで十分です)。
2
BlackBeard

または他の便利な方法:

_.omit(arr, _.findWhere(arr, {id: 3}));

私の2セント

2
Nadeem

私は以前この方法を試してみました

_.filter(data, function(d) { return d.name != 'a' });

ユーザーによって提供された上記の解決策のようなあまりにも良い方法があるかもしれません

0
Bastin Robin

Underscore.jsを使用して

var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];

var resultArr = _.reject(arr,{id:3});

console.log(resultArr);

結果は:: [{id:1name:'a'},{id:2,name:'c'}]になります。

0
Anand Tamizh