UnderscoreJSを使用して配列からアイテムを削除する


137

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

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

そして、id = 3のアイテムを配列から削除したいと思います。スプライシングなしでこれを行う方法はありますか?アンダースコアまたはそのようなものを使用して何かメイズ?

ありがとう!


新しい配列を作成したくない場合は、スプライシングが唯一の選択肢です。私はアンダースコアもそれを使用するに違いない(そのような方法が存在する場合、内部的に)。
Felix Kling 2013年

6
スプライシングの何が問題になっていますか?
–ŠimeVidas 2013

アンダースコアの参照を確認しましたか?
–ŠimeVidas 2013

単純なJavaScriptを使用するだけで、これはオブジェクトプロパティによる配列からのオブジェクト削除の複製です。
Felix Kling 2013年

5
「underscore.js」のタグがあるため、重複はありません
Garis M Suero 2013年

回答:


279

単純な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。これは他の質問にも示され、undescoreはそのための便利な機能を提供していないようです。


1
はい、これは完全に機能します。アンダースコアのドキュメントを調べましたが、抜きでどうやってそれを引き出すかはよくわかりませんでした。ありがとうございました!
クライモイド2013年

10
ここでは_.rejectまたは_.filter()の方がはるかに効率的ではないでしょうか?1つのアイテムを取り出すだけで、リストが2回繰り返されることになります。
Rick Strahl、2013

1
これは重複しているかもしれませんが、これはより良い答えです。
Michael J. Calkins 2013年

2
@RickStrahlあなたは正しいです。_.rejectここではより良い選択のように見えます。
Tarik、2015

1
@lukaserat最後の要素をポップするには、次を使用しarr.pop()ます...
Emile Bergeron

96

アンダースコアを使用できます .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


私はあなたが意味したと思います:var Filtered = _.filter(arr、function(item){return item.id!== 3});
tbh__ 2016年

2
@tbh__ _()は、アンダースコアメソッドを呼び出すことができるコレクションのラッパーを作成します。
スサント

アンダースコアを何年も使用しているので、これを知らなかった。ありがとう
tbh__


16

Underscoreには、特に削除するオブジェクトがある場合に、配列から項目を削除するのに最適な_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


2
注:これは、samオブジェクトを渡さないためにのみ機能します。代わりに{ Name: "Sam", Age: 19 }、変数samではなくwithout に渡すと、機能しなくなります。フィドル
アダム

5

文字列をフィルタリングし、大文字と小文字を区別しないフィルターを探している場合は注意してください。_.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"]

4

他の答えは、配列の新しいコピーを作成します。配列を変更したい場合は、以下を使用できます。

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

ただし、これは要素が常に配列内にあることを前提としています(見つからない場合でも、最後の要素は削除されるため)。安全のためにあなたは使うことができます:

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

2

または別の便利な方法:

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

私の2セント


1
omitは動作しobject、を返しますobject。したがって、要素を削除した後で取り戻すArraysことが期待できる場所での作業には適していませんarray
ScrapCode 2016年

1
したがって、_。withoutはあなたが見ているものです: _.without([1, 2, 1, 0, 3, 1, 4], 0, 1); => [2, 3, 4]
Nadeem

2

次のような単純な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#reduceArray#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で十分です)。

0

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

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

ユーザーが提供する上記のソリューションのようなより良い方法もあるかもしれません


0

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'}]


-1

Underscoreのrejectメソッドを使用できます。以下は、特定の一致を持つ配列を持たない新しい配列を返します

arr = _.reject(arr, function(objArr){ return objArr.id == 3; });
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.