web-dev-qa-db-ja.com

配列内のフィルターされた要素をフィルターおよび削除する

元の配列の特定の要素(_var a_)を削除したい。 I filter()その配列とsplice()は新しい配列を返しました。ただし、このコードの元の配列には影響しません。元の配列からこれらの要素を簡単に削除するにはどうすればよいですか?

_var a = [{name:'tc_001'}, {name:'tc_002'}, {name:'tc_003'}]

var b = a.filter(function (e) {
    return e.name === 'tc_001';
});

b.splice(0,1);

console.log(a);
console.log(b);
_
13
s1n7ax

Array.prototype.filter()メソッドは、1つのアイテムだけでなく要素セットを収集するために使用されます。条件を評価して1つのアイテムを取得する場合は、他に3つのオプションがあります。 Array.prototype.indexOf()Array.prototype.findIndex()、およびArray.prototype.find()したがって、複数のアイテムを操作する場合にのみ、フィルター関数を使用することを検討してください。完了する必要のある仕事に関して、完全な答えはありません。彼らはフィルター関数を使用してセットを分離しますが(この例では1つのアイテムのみになる可能性があります)、セット全体を削除する方法を示していません。それでは、明確にしましょう。

配列の1つの項目のみを検索して削除する場合は、次のようにします。

var a = [{name:'tc_001'}, {name:'tc_002'}, {name:'tc_003'}];
a.splice(a.findIndex(e => e.name === "tc_001"),1);
console.log(a);

ただし、複数の「特定の要素」に言及するため、選択したアイテムのセットを収集し、セット内の各要素で上記のジョブを1つずつ実行する必要があります。したがって、適切なアプローチは次のようになります。

var a = [{name:'tc_001'}, {name:'tc_002'}, {name:'tc_003'}],
    b = a.filter(e => e.name === "tc_001");
b.forEach(f => a.splice(a.findIndex(e => e.name === f.name),1));
console.log(a);

選択リストにある要素の数に関係なく、これはあなたの仕事をします。しかし、これは論理的に見えますが、多くの冗長な仕事をしていると思います。最初にフィルターをかけ、次にフィルターされた要素ごとにインデックス検索を行います。 findIndexが非常に高速であることはわかっていますが、特に大きな配列の場合、これが著しく遅くなることが予想されます。 o(n)ソリューションを見つけましょう。

    var a = [{name:'tc_001'}, {name:'tc_002'}, {name:'tc_003'}];
    a = a.reduce((p,c) => (c.name !== "tc_001" && p.Push(c),p),[]);
console.log(a);

だから、これはそれでなければなりません。

23
Redu

別の方法は、次のような2つのリストでフィルタリングすることです。

const originalList = [{condition:true}, {condition: false}, {condition: true}];

// wished lists
const listWithTrue = originalList.filter(x=>x.condition);
const listWithFalse = originalList.filter(x=>!x.condition); // inverse condition
6
Ninja Coding

私はパーティーに少し遅れていることを知っていますが、少し異なるアプローチはどうですか?

var a = [{name:'tc_001'}, {name:'tc_002'}, {name:'tc_002'}, {name:'tc_002'}, {name:'tc_003'}];

while ( a.findIndex(e => e.name === 'tc_002' ) >= 0 )
 a.splice( a.findIndex(f => f.name === 'tc_002'),1);
 
console.log(a);

私はそれがいくつかの欠点を持っていることを知っていますが、私はそれがいくつかのケースであなたの何人かを助けることを願っています:)

乾杯!

2
Kamil Wężyk

したがって、理解した場合、元の配列(a)からフィルターに一致する要素を削除し、新しい配列に保持する(b)このソリューションが必要なものかどうかを確認します。

var a = [{name:'tc_001'}, {name:'tc_002'}, {name:'tc_003'}]

var b = a.filter(function (e) {
      return e.name === 'tc_002'
});

b.forEach(function(element) {
   console.log(element)
   var index = a.indexOf(element)
   console.log(index)
   a.splice(index, 1)
})

結果:a = [{"name": "tc_001"}、{"name": "tc_003"}] b = [{"name": "tc_002"}]

2
Shil Nevado

元の配列に変更を加えることができます。

var a = [{name:'tc_001'}, {name:'tc_002'}, {name:'tc_003'}]
a = a.filter(function (e) {
    return e.name === 'tc_001';
});
a.splice(0,1);

または、独自のコードでaに適用するだけで、bに行ったことすべてを適用できます。

a = b

[編集]

おそらく、各アクションが何をするかを拡張すると、より明確になるでしょう。

var a = [{name:'tc_001'}, {name:'tc_002'}, {name:'tc_003'}]
// You now have array a with 3 elements.

b = a.filter(function (e) {
    return e.name === 'tc_001';
});
// a is still 3 elements, b has one element (tc_001)

b.splice(0,1);
// You remove the first element from b, so b is now empty.

要素を削除する場合はtc_002およびtc_003 from aが、bに保持します。これがあなたにできることです:

var a = [{name:'tc_001'}, {name:'tc_002'}, {name:'tc_003'}]
b = a.filter(function (e) {
    return e.name != 'tc_001';
});
a = a.filter(function(item) { return b.indexOf(item) == -1; });
console.log(a); // tc_001
console.log(b); // tc_002, tc_003
1
AlexD

フィルター配列をそれ自体に割り当ててから、スプライスを適用できます。

以下の例:

var a = [{name:'tc_001'}, {name:'tc_002'}, {name:'tc_003'}]
a = a.filter(function (e) {
    return e.name === 'tc_001';
});

a.splice(0,1);
1
Suneet Bansal