このコードがあるとしましょう
var arr = [{id:1、name: 'a'}、{id:2、name: 'b'}、{id:3、name: 'c'}];
そして、id = 3のアイテムを配列から削除したいと思います。スプライシングなしでこれを行う方法はありますか?アンダースコアまたはそのようなものを使用して何かメイズ?
ありがとう!
このコードがあるとしましょう
var arr = [{id:1、name: 'a'}、{id:2、name: 'b'}、{id:3、name: 'c'}];
そして、id = 3のアイテムを配列から削除したいと思います。スプライシングなしでこれを行う方法はありますか?アンダースコアまたはそのようなものを使用して何かメイズ?
ありがとう!
回答:
単純な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はそのための便利な機能を提供していないようです。
_.reject
ここではより良い選択のように見えます。
arr.pop()
ます...
アンダースコアを使用できます .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
_()
は、アンダースコアメソッドを呼び出すことができるコレクションのラッパーを作成します。
アンダースコアを使用_.reject()
:
arr = _.reject(arr, function(d){ return d.id === 3; });
arr = _.reject(arr, d => d.id === 3 );
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
。
文字列をフィルタリングし、大文字と小文字を区別しないフィルターを探している場合は注意してください。_.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"]
他の答えは、配列の新しいコピーを作成します。配列を変更したい場合は、以下を使用できます。
arr.splice(_.findIndex(arr, { id: 3 }), 1);
ただし、これは要素が常に配列内にあることを前提としています(見つからない場合でも、最後の要素は削除されるため)。安全のためにあなたは使うことができます:
var index = _.findIndex(arr, { id: 3 });
if (index > -1) {
arr.splice(index, 1);
}
または別の便利な方法:
_.omit(arr, _.findWhere(arr, {id: 3}));
私の2セント
object
、を返しますobject
。したがって、要素を削除した後で取り戻すArrays
ことが期待できる場所での作業には適していませんarray
。
_.without([1, 2, 1, 0, 3, 1, 4], 0, 1); => [2, 3, 4]
次のような単純なJavaScriptのArray#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);
注意: