2017-05-20 11 views
0

配列(this.players)内のすべてのオブジェクトの数を取得しようとしていますが、object.alive == trueの場合です。これはJS.mapを使用する正しい方法ですか?

は、これまでのところ私が持っている:罪として醜い見えますが、動作しているように見えます

return this.players.map(el => el.alive).reduce(function(acc, cur) { 
    if(acc === true) { 
     if(cur === true) { 
     acc = 1 
     } else { 
     acc = 0 
     } 
    } 
    return acc + ((cur) ? 1 : 0) 
    }) 

。これを行うより堅牢な方法はありますか?

+0

、返す '0' [ '用:

また、代わりに自分のaliveプロパティにマッピングする選手の、ちょうど直接内のプロパティは、コールバックを減らすことへのアクセス{alive:true}、{alive:false}] 'です。 –

+0

'if(acc === true)'は意味をなさない。あなたのアキュムレータは数字であるはずです。 'reduce'に開始値として' 0'を渡してください! – Bergi

+0

最初の反復で 'acc 'がデフォルトにtrueに設定されているとします。チェックするフィールドの型がブール値であるためです。そのため、チェックインを入れます。 – khany

答えて

1

Array.reduceが良い選択であるfilterは、あなたのケースのために良いだろうと思いますaliveプレイヤーではなく、プレイヤー自身である。

あなたの問題はreduceコールバック内にある:accnumberaliveの選手を蓄積し、あなたはtrueにそれを比較するべきではありません。

acc = 1またはacc = 0で番号をリセットする代わりに、おそらくacc += 1を書き込むことを意味します。それは、正しく動作していない

let players = [{alive: true}, {alive: false}, {alive: false}, {alive: true}]; 
 

 
let alive = players.reduce((alive, next) => next.alive ? alive + 1 : alive, 0); 
 

 
console.log(alive);

+0

このエラーは空の配列 – khany

+0

@khanyいいえ、空の配列(reduceメソッドに提供されているデフォルト値)に '0'を返します。 –

0

フィルタを試してください。マップされたフィルタは、フィルタリングされたオブジェクトの配列を返します。

return this.players.filter(player => player.alive); 
0

提供機能により実現テストに合格するすべての要素を使用して新しい配列を作成し使用Array.prototype.filter()

return this.players.filter(player => player.alive).length; 
0

は、私はあなたが実際にちょうどの数をしたいときには、フィルタ配列の計算を避けるよう

let players = [{alive: true}, {alive: false}, {alive: false}, {alive: true}] 
 

 
let alivePlayersNum = players.filter(player => player.alive).length; 
 

 
console.log(alivePlayersNum);

関連する問題