2017-03-22 4 views
1
function filter_list(l) { 
    l.map((item,i,main) => { 
    if(typeof item==="string") 
    {return main.splice(i,1);} 
     else 
     return item; 
    }); 
    console.log(l); 
} 
filter_list([1,'a','b','c',0,15,'k','e']); 

ここでは、出力は[1, 0, 15]です。しかし、代わりにそれは私に[1, "b", 0, 15, "e"]を与えています。それは別の文字列を削除していないようです。また、私は新しい配列変数で更新された配列を取得しようとしているが、私はここでそれを行う方法を考えていない。いくつかの助けは非常に高く評価されるだろう。スプライス機能が配列から2つの連続した文字列を削除しない

+0

あなたはすべての文字列を削除しますか? – fubar

+0

はい。しかし、マップ –

+1

好奇心、なぜマップを使用したいですか? – fubar

答えて

2

問題は、元の配列から要素をスプライスするとき、あなたが今1の指標とaを削除すると、元の配列であるため、2のインデックスと次の要素がcある例えばので、あなたは、map()の繰り返しで問題を得ることです今これは[ 1, "b", "c", 0, 15, "k", "e" ]ですので、bをスキップしてください。要素を削除しないと、そのマップがコード内の数字と一致しないことがわかります。

function filter_list(l) { 
 
    l.map((item, i, main) => { 
 
    if (typeof item == "string") main[i] = null 
 
    }) 
 
    return l; 
 
} 
 

 
console.log(filter_list([1, 'a', 'b', 'c', 0, 15, 'k', 'e']))

+0

地図上で作業している配列の長さが変わってもマップはどのように機能しますか? – daft300punk

+0

':)'はしません。 –

+0

私は考えを得る。私はメイン配列に触れていないと私は別の変数にこれを設定する方法を言うことができますか? –

2

filter関数を使用してでないものすべてに対してtrueを返す方がはるかに簡単です。

var a = [1, 'a', 'b', 'c', 0, 15, 'k', 'e']; 
var b = a.filter(function (item) { 
    return ! (typeof item === 'string'); 
}); 
+0

OPは連続していますが、上記のソリューションを使用して希望の出力を達成しています。 – fubar

関連する問題