2016-05-23 6 views
1

元の配列の特定の要素を削除します(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); 
+0

Array.prototype.filter()の代わりになるものは何ですか?(http://stackoverflow.com/q/37318808/1447675) –

+0

次のa.splice(0、 1)。 –

答えて

1

Array.prototype.filter()メソッドは、 n要素は1つの項目だけでなく、条件を評価して1つのアイテムを取得する場合は、3つのオプションがあります。 Array.prototype.indexOf(),および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);

を行きます。

+0

私は最後のものを手に入れません。最後の1つをより簡単な形式に分解してください。 'a.reduce(function、pre、curr){' 'if(curr.name!==" tc_001 "){' 'return p.push(curr ); ' '} else {' ' return p、[]; ' '} ' '}) ' なぜ現在のオブジェクトを前のオブジェクトにプッシュしますか? – CoderS

+0

ああ。あなたは新しい配列を作成していますか? – CoderS

+1

はい、元の配列を変更するのではなく、新しい配列を作成しますが、最終的に元の配列をreduce関数の結果で上書きしています。あなたが近づいているコードについては、次のようになります。 'a.reduce(function(pre、curr){if(curr.name!==" tc_001 ")p.push(curr); return p;}、 []) 'push()'関数はプッシュされた配列を返しないので、p.push(curr)の結果を返すことはできません。それは愚かです。したがって、reduce関数を動作させるためには、p配列を別々に返さなければなりません。私のコードでは、これが '、' pが最後に来る理由です。 – Redu

0

あなたは、元の配列に変更を加えることができ、次のいずれか

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); 

したり、独自のコードでは、ちょうどあなたがb

a = b 

に行ってきたaすべて[編集]に適用されます

おそらく、私がそれぞれの行動が何をしているのかを明らかにすれば、より明確になるでしょう。

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_002tc_003aからではなく、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 
+0

次に、 'a' {name: 'tc_002'}、{name: 'tc_003'}の参照を変更した後、これら2つの要素をどのように使用するのでしょうか。 – CoderS

+0

あなたはその質問について何も言及していません。 'a'から要素を削除したいのですが、別の配列に保持したいのですか? – AlexD

+0

Q:「どのようにして元のアレイの要素を簡単に削除できますか?」 – CoderS

0

あなたが自分自身にフィルタアレイを割り当て、適用することができますその上にスプライス。以下

例:

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); 
+0

これはAlexDとはどのような違いがありますか? –

2

私は理解している場合ので、あなたは元の配列(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 = [{ "名": "tc_001"}、{ "名": "tc_003"}] B = [{ "名": "tc_002"}]

関連する問題