2017 업데이트 : 바닐라 JS를 사용한 2 줄 답변
여기에있는 모든 답변은 지나치게 복잡 하며 대부분 20 줄 이상의 코드가 필요합니다.
이 예제는 lodash, underscore 또는 기타 라이브러리없이 두 줄의 바닐라 JavaScript 만 사용합니다 .
let f = (a, b) => [].concat(...a.map(a => b.map(b => [].concat(a, b))));
let cartesian = (a, b, ...c) => b ? cartesian(f(a, b), ...c) : a;
최신 정보:
위와 동일하지만 ESLint 를 eslint-config-airbnb- base 와 함께 사용하여 검증 된 Airbnb JavaScript 스타일 가이드 를 엄격하게 따르도록 개선되었습니다 .
const f = (a, b) => [].concat(...a.map(d => b.map(e => [].concat(d, e))));
const cartesian = (a, b, ...c) => (b ? cartesian(f(a, b), ...c) : a);
원본 코드의 linter 문제에 대해 알려 주신 ZuBB 에게 특별히 감사드립니다 .
예
이것은 귀하의 질문에 대한 정확한 예입니다.
let output = cartesian([1,2],[10,20],[100,200,300]);
산출
다음은 해당 명령의 출력입니다.
[ [ 1, 10, 100 ],
[ 1, 10, 200 ],
[ 1, 10, 300 ],
[ 1, 20, 100 ],
[ 1, 20, 200 ],
[ 1, 20, 300 ],
[ 2, 10, 100 ],
[ 2, 10, 200 ],
[ 2, 10, 300 ],
[ 2, 20, 100 ],
[ 2, 20, 200 ],
[ 2, 20, 300 ] ]
데모
데모보기 :
통사론
여기에서 사용한 구문은 새로운 것이 아닙니다. 내 예에서는 스프레드 연산자와 나머지 매개 변수를 사용합니다.이 기능은 2015 년 6 월에 발행 된 ECMA-262 표준 6 판에 정의 된 JavaScript의 기능이며 훨씬 더 일찍 개발되었으며 ES6 또는 ES2015로 더 잘 알려져 있습니다. 보다:
이렇게 코드를 간단하게 만들어서 사용하지 않는 것은 죄악입니다. 기본적으로 지원하지 않는 이전 플랫폼의 경우 항상 Babel 또는 기타 도구를 사용하여 이전 구문으로 변환 할 수 있습니다. 사실 Babel로 변환 한 제 예제는 여기에있는 대부분의 예제보다 여전히 짧고 간단하지만 그렇지 않습니다. 번역의 결과물은 이해하거나 유지해야하는 것이 아니기 때문에 정말 중요합니다. 단지 제가 흥미로워 한 사실입니다.
결론
유지 관리가 어려운 수백 줄의 코드를 작성할 필요가 없으며 두 줄의 바닐라 자바 스크립트가 작업을 쉽게 수행 할 수있는 간단한 작업을 위해 전체 라이브러리를 사용할 필요가 없습니다. 보시다시피 언어의 최신 기능을 사용하는 것이 실제로 효과가 있으며 최신 기능을 기본 지원하지 않는 구식 플랫폼을 지원해야하는 경우 항상 Babel 또는 기타 도구를 사용하여 새 구문을 이전 구문으로 변환 할 수 있습니다. .
1995 년처럼 코딩하지 마세요
자바 스크립트는 진화하고 있으며 그 이유가 있습니다. TC39는 새로운 기능을 추가하여 언어 디자인의 놀라운 작업을 수행하고 브라우저 공급 업체는 이러한 기능을 구현하는 놀라운 작업을 수행합니다.
브라우저의 특정 기능에 대한 현재 기본 지원 상태를 보려면 다음을 참조하십시오.
Node 버전의 지원을 보려면 다음을 참조하십시오.
기본적으로 지원하지 않는 플랫폼에서 최신 구문을 사용하려면 Babel을 사용하세요.