Cập nhật năm 2017: Câu trả lời 2 dòng với vani JS
Tất cả các câu trả lời ở đây đều quá phức tạp , hầu hết chúng mất 20 dòng mã hoặc thậm chí nhiều hơn.
Ví dụ này chỉ sử dụng hai dòng JavaScript vani , không có dấu gạch ngang, dấu gạch dưới hoặc các thư viện khác:
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;
Cập nhật:
Điều này tương tự như trên nhưng được cải thiện để tuân thủ nghiêm ngặt Hướng dẫn tạo kiểu JavaScript của Airbnb - được xác thực bằng ESLint với eslint-config-airbnb-base :
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);
Đặc biệt cảm ơn ZuBB đã cho tôi biết về sự cố linter với mã gốc.
Thí dụ
Đây là ví dụ chính xác từ câu hỏi của bạn:
let output = cartesian([1,2],[10,20],[100,200,300]);
Đầu ra
Đây là đầu ra của lệnh đó:
[ [ 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 ] ]
Bản giới thiệu
Xem các bản trình diễn trên:
Cú pháp
Cú pháp mà tôi sử dụng ở đây không có gì mới. Ví dụ của tôi sử dụng toán tử spread và các tham số còn lại - các tính năng của JavaScript được định nghĩa trong ấn bản thứ 6 của tiêu chuẩn ECMA-262 được xuất bản vào tháng 6 năm 2015 và được phát triển trước đó nhiều, được biết đến nhiều hơn với tên gọi ES6 hoặc ES2015. Xem:
Nó làm cho mã như thế này đơn giản đến mức không sử dụng nó là một tội lỗi. Đối với các nền tảng cũ không hỗ trợ nó, bạn luôn có thể sử dụng Babel hoặc các công cụ khác để chuyển nó sang cú pháp cũ hơn - và trên thực tế, ví dụ của tôi được chuyển bằng Babel vẫn ngắn hơn và đơn giản hơn hầu hết các ví dụ ở đây, nhưng nó không thực sự quan trọng bởi vì đầu ra của chuyển đổi không phải là thứ mà bạn cần phải hiểu hoặc duy trì, đó chỉ là một thực tế mà tôi thấy thú vị.
Phần kết luận
Không cần phải viết hàng trăm dòng mã khó bảo trì và không cần phải sử dụng toàn bộ thư viện cho một việc đơn giản như vậy, khi hai dòng JavaScript vani có thể dễ dàng hoàn thành công việc. Như bạn có thể thấy, việc sử dụng các tính năng hiện đại của ngôn ngữ thực sự mang lại hiệu quả và trong trường hợp bạn cần hỗ trợ các nền tảng cổ xưa mà không có hỗ trợ gốc của các tính năng hiện đại, bạn luôn có thể sử dụng Babel hoặc các công cụ khác để chuyển cú pháp mới sang cú pháp cũ .
Đừng viết mã như năm 1995
JavaScript phát triển và nó làm như vậy là có lý do. TC39 thực hiện một công việc tuyệt vời của thiết kế ngôn ngữ với việc thêm các tính năng mới và các nhà cung cấp trình duyệt đã thực hiện một công việc đáng kinh ngạc trong việc triển khai các tính năng đó.
Để xem trạng thái hỗ trợ gốc hiện tại của bất kỳ tính năng cụ thể nào trong trình duyệt, hãy xem:
Để xem hỗ trợ trong các phiên bản Node, hãy xem:
Để sử dụng cú pháp hiện đại trên các nền tảng không hỗ trợ nó, hãy sử dụng Babel: