2016-06-27 4 views
4

現在、リストの「すべて」が検出された場合、出力は[""]になります。
予想される出力:[]array.map関数で何も返さない方法(空の配列)

Copy.names = rule.names.map(function(x) {         
    if (x.name ==='Everything') {         
     return ''; 
    } else { 
     return x.name; 
    } 
}); 
+0

だけ返す '書く;'また、これにArray.prototype.filterを使用することを検討してください。 – theWanderer4865

+0

もし私がそれをしたら、私は望ましくない 'null'を返します。 – Angular

+2

おそらく 'filter'のようなメソッドを使いたいと思うでしょう。 'map'は反復処理するすべての要素の要素を返します。 – dyagmin

答えて

5

使用Array.prototype.filter:

Copy.names = rule.names.filter(function(x) {         
    return x.name !=='Everything'; 
}).map(function (x) { 
    return x.name; 
}); 
+0

これを実行しました。実際には 'すべてが間違っています – Angular

+0

元の投稿にコードを使用している場合、問題はArray.prototype.mapがリストのすべての要素に変換を適用することです。代わりに、いくつかのロジックを使用して、不要な要素を削除または無視する必要があります。 Array.prototype.mapには要素だけを無視する機能がないため、Array.prototype.filterのような別の関数と組み合わせる必要があります。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter – Dylon

+1

'x.nameではないはずですか?== 'Everything''? – GingerPlusPlus

0

あなたは(私は非常にお勧め)Lodashを使用することができた場合は、あなたが使用してエレガントな方法でそれに対処することができます:

Copy.names = _.flatMap(rule.names, function(x) { 
    if (x.name ==='Everything') {         
     return []; 
    } else { 
     return [x.name]; 
    } 
}) 

あなたが見ることができるようにあなたの代わりにアイテムの項目の配列を返すことを除いて、それは、mapに似ます。

+1

このアプローチの注意点は、rule.namesのすべての要素に対して一時配列を作成することです。これはほんの数要素で大きな問題ではありませんが、大きなリストではコストがかかる可能性があります。 – Dylon

1

あなたはES6を使用することができる場合、あなたはそのために発電機を使用することができます。

Copy.names = Array.from(function*() { 
    for (var x of rule.names) { 
     if (x.name ==='Everything') {         
      // do nothing 
     } else { 
      yield x.name; 
     } 
    } 
}) 

ない場合は...あなたがいつも不可欠道のために行くことができます。

Copy.names = [] 

for (var x of rule.names) { 
    if (x.name ==='Everything') {         
     // do nothing 
    } else { 
     Copy.names.push(x.name); 
    } 
} 
+0

私は最初のアプローチ(Using Array.from with generator)は動作しないと思います。私はES6対応のさまざまな環境で試してみましたが、常に空の配列を返します。 – Chris

関連する問題