이 "이 배열 함축"라고하고 많은 중 하나입니다, 많은 기능이 ECMAScript를 하모니를위한 제안 , 나는 그것이 최종 릴리즈에 실제로 포함될 것인지에 대한 어떠한 실질적인 생각도 없다고 생각합니다. "JavaScript 1.7"(애매한 "표준" 사양의 일부로 Firefox에서 은 실제로이 모질라 기반 항목에만 적용됨)으로 Firefox에서 사용할 수 있습니다. 그러나 특히 다른 브라우저에서 구문 오류가 발생할 때 FF 고유 구문을 피하는 것이 좋습니다.
"Array Comprehensions"에 대한 Google 검색을 통해 자세한 내용을 읽을 수 있지만 앞서 언급했듯이 모질라 특성으로 인해 매우 유용한 도구는 아닙니다.
당신은 ES5에 소개 된 reduce()
배열 방법을 사용하여 훨씬 더 코드없이 유사한 효과를 얻을 수 있습니다
//JavaScript has no "range" function, so let's make one
var range = function (begin, length) {
var i, ret = [];
for (i = begin; i < begin + length; i++) {
ret.push(i);
}
return ret;
};
var evens = range(0, 21).reduce(function (arr, cur) {
if (cur % 2 === 0) arr.push(cur);
return arr;
}, []);
수 있습니다 약간의 자세한 비교 무엇을 당신도 염두에두고 (찾고 있던 것을 우리 range()
함수를 만들어야했습니다.) 그러나 이것은 많은 "설정"을 필요로하지 않는 비교적 컴팩트 한 솔루션이며 문제 해결에 주로 집중합니다. 한 어레이의 요소를 필터링하여 두 번째 어레이를 형성합니다.
필자는 한 줄로 줄일 수 있었지만 유지 관리가 조금은 어색해 졌기 때문에 대신 두 줄 버전을 제안하기로 결정했습니다.경우에 당신은 한 줄에 관심이, 여기있다 :
//Don't forget to define "range()"
var evens = range(0, 21).reduce(function (arr, cur) {
return (cur % 2 === 0) ? (arr.push(cur) && arr) : arr;
}, []);
는 다시,이 ES5 코드입니다. 구형 브라우저에서 작동 시키려면
Array.reduce()
에 대한 지원을 제공하는 shim이 필요합니다. MDN은 여기에서있다 :
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/Reduce
UPDATE :
내가 filter()
대신 reduce()
을 사용해야처럼 보인다. 코드를 훨씬 깔끔하게 만듭니다. 그것을 제안을위한 OP 덕분에! 당신이 오래된 브라우저에서 제대로 작동 할 수 있도록하기 위해 심 (shim)이 필요합니다, 그래서
var evens = range(0,21).filter(function (cur) { return cur % 2 === 0; });
다시 filter()
은 ES5이다.
_ "이런 종류의 구문을 설명하기 위해 어떤 이름이 주어 집니까?"_ 링크 된 기사는 "배열 이해"라고합니다. – nnnnnn
내가 틀렸을 수도 있지만, 그 용어는 배열 부분 내부의 'for each'를 가리키고 있다고 생각합니다. 나는 배열의 밖에서 사용 된이 다른'if' 문법을 보았다고 생각하지만 확실하지 않습니다. ? –
_ 단지 배열의 이해가 훨씬 더 간단하지만, 실제로는 더 쉽게 읽을 수 있습니다. ** 일단 개념에 익숙해지면 **. 나는 모든 사람들이 구문을 알고 있다는 것을 확신하면 그것을 감히 쓸모가 있습니다. 유지 관리자가 폭력적인 정신병자이고 모두 ... – Laoujin