2016-04-14 8 views
1

私は以下の実装をしました。どのようにjavascript配列の空白の要素を削除するには?

Array.prototype.abc = function(condition, t){ 
    var arr = []; 
    for(var i = 0; i < this.length; i++){ 
     arr.push(condition(this[i],t));   
    } 
    return arr; 
}; 

var a = [1,2,3,4]; 
var t = 2; 

alert(a.abc(function(item,diviser){ 
    if(item % diviser === 0) { return item; } 
},t)); 

結果は[2,4]である必要があります。代わりに私は[,2,,4]を得ています。

私は以下の条件を試しましたが、常に上記の結果を返します。

if(condition(this[i],t) !== false){ arr.push(condition(this[i],t)); } 

この私が

if(item % diviser === 0) { return item; } else { return false; } 

を行う際false条件は私が他の部分に戻る任意の値'false'またはtrueまたは'true'またはそのことについては仕事をdoesnotやっています。実際の実装では私はelseの部分を持っていません。空のセクションを削除するにはspliceか何かを使うことができます。しかし、なぜ私は空白が作成されて何も戻っていない場合でも私は理解していない。そして、使用した後であっても、arr.pushの前の状態では動作しません。正確に何が起こっているのか、配列内のブランクを削除する方法は?

答えて

1

あなたは

  1. !== false、ので、あなたがこの問題を解決するが、それが失敗する2つの異なる試みを行った

    for(var i = 0; i < this.length; i++){ 
        var x = condition(this[i],t); 
        if(typeof x !== "undefined") arr.push(x);   
    } 
    

    、返される値は、あなたのcallBackからundefinedであるかどうかを確認する必要がありますコールバックは、番号または未定義のいずれかを返します。したがって、厳密な等価は常に失敗し、オペランドの型が異なるため常にfalseに評価されます。

  2. if(item % diviser === 0) { return item; } else { return false; }これは、条件が満たされずにfalseが配列にプッシュされたときにfalseを返します。そして、その部分をスキップすることはありません。

+0

私が 'else {return false;を返すと'!== false'と比較しようとしました。 } '。しかし、これは機能しません。どうしてこんなことに? – Sp0T

+0

ok。ありがとう。今理解した。 – Sp0T

+0

@ Sp0Tこのスニペット、 'condition(this [i]、t)&& arr.push(this [i]);'がメイン配列にある場合、これは '0'を無視します。 –

0

体温計をプッシュの外側に移動させてから置きます。条件はtrueまたはfalseを返すだけです。

condition(this[i],t) && arr.push(this[i]);   
0

これは、conditionが返されているものに関係なくプッシュしているためです。

あなたconditionメソッドが明示的にfalseをreturingされているので、あなたは、単にval !== false

DEMO

Array.prototype.abc = function(condition, t){ 
 
    var arr = []; 
 
    for(var i = 0; i < this.length; i++){ 
 
     var val = condition(this[i],t); console.log(val); 
 
     val !== false && arr.push(val); 
 
    } 
 
    return arr; 
 
}; 
 

 
var a = [1,2,3,4]; 
 
var t = 2; 
 

 
document.body.innerHTML += a.abc(function(item,diviser){ 
 
    if(item % diviser === 0) { return item; } else { return false; } 
 
},t);
01を確認することができ

var val = condition(this[i],t) 
val = val !== false && arr.push(val); 

この

arr.push(condition(this[i],t)); 

を交換してください

関連する問題