2017-05-20 1 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 플레이어. accnumberalive의 선수를 축적, 그래서 당신은 true와 비교해서는 안 :

귀하의 문제는 reduce 콜백에 있습니다.

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

나는 당신이 실제로 단지의 수를 할 때 필터링 된 배열의 계산을 피할 수로

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

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

 
console.log(alivePlayersNum);

관련 문제