2014-11-15 1 views
1

다음 코드가 작동합니다. 그러나 기능 프로그래밍 스타일 방식에서 배열 값을 수정하는 것이 올바른 방법일까요? 코드가 작동Array 내부의 배열 값을 변경하는 것이 좋습니까? Array.some e.t.c

a = [1, 2, 3]; 
a.every(function(val,index, arr) { 
if (val === 2) { 
    arr[index] += 1; 
} 
}); 
+1

실제로는 '맵'이 아닌 '모든 것'을 원할 것입니다. – elclanrs

+0

왜 안 되니? 'some'과'every'의 배열 값을 수정할 수 있습니다. 값을 삭제할 수도 있고 메서드가 예상대로 작동 할 수 있습니다. 사실 두 가지 방법 모두 해당 동작을 지원하도록 설계되었습니다. http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.17 그러나 예제에서는'every'를 사용해서는 안되며'map'을 사용해야합니다. – dfsq

+1

'map','filter' 등을 사용하면 돌연변이를 피할 수있을 것입니다. 그리고 그것이 그것이 요구하는 스타일이라고 생각합니다. 만약 배열을 "수정"해야하고 어떤 방법도 도움이되지 않는다면 새로운 accumulator로'reduce'를 사용합니다. – elclanrs

답변

1

호 있지만, 개념적 당신은 forEach 방법을 사용한다 대신, here를 참조하십시오. (또한, 가독성을 위해, 당신의 arr 인수를 삭제하고 this를 사용합니다.)

+0

이라고 말하면된다.이 예제에서는 siutation에 의존한다. (예를 들어'map'은 더 관용적 인 함수이다.) 일반적으로 함수에서 배열을 편집하고 싶다면'forEach'를 사용하는 것이 더 나을 것이다. . 또한 forEach는 jQuery 메서드가 아니므로 'this'는 전역 객체를 참조하거나 엄격 모드에서는 정의되지 않습니다. –

+0

@ Qantas94Heavy, 당신은 절대적으로'this'가 콜백에서 사용될 수 없다는 것이 옳습니다. 나는 내 대답을 편집 할 것이다. 그러나 OP가 원했던 것이 아닌 새로운 배열을 만드는 것이'map'을 사용하려는 것에 동의하지 않습니다. –

0

을하지만 기능적인 프로그래밍 스타일 방법 내에서 배열 값을 변경할 수있는 권리 방법입니다.

아니요. 기능 프로그래밍 패러다임을 사용하면 어떤 방법을 사용하든 개체를 수정하면 안됩니다. 더 나은 : 당신이했던 것처럼 every를 사용하는 것이 더 의미가 없다는 것을

var a = [1, 2, 3]; 
var b = a.map(function(val) { 
    return (val === 2) ? 3 : val; 
}); 

공지 사항 - 당신은 모든 요소에 조건을 테스트에 관심이 없습니다. 콜백의 부작용을 실제로 처리하려면 forEach을 사용해야합니다 (기능적으로는 충분하지 않지만 최소한 의사를 분명히합니다).

관련 문제