produk daftar kartesius javascript

saya memerlukan produk kartesius dari dua daftar javascript.

Contoh:

let l1 = ['a','e','f'];
let l2 = ['1','3','2'];
let lp = prod(l1, l2);

aku akan menjadi

[
['a','1'],
['e','1'],
['f','1'],
['a','3'],
['e','3'],
['f','3'],
['a','2'],
['e','2'],
['f','2']
]

Saya dapat dengan mudah melakukannya dengan loop for/foreach, tetapi bertanya-tanya apakah seseorang memiliki saran elegan dengan fungsi peta.


person spacm    schedule 30.01.2020    source sumber


Jawaban (4)


Anda dapat menggunakan kombinasi pengurangan dan peta:

console.log(l1.reduce((result, el1) => {
  result.push(...l2.map((el2) => [el1, el2]));
  return result;
}, []));
person Kaca992    schedule 30.01.2020

Coba seperti berikut

let l1 = ['a','e','f'];
let l2 = ['1','3','2'];

console.log(l1.map(a => {
  return l2.map(b => {
    return [a,b];
  })
}).flat())

person Ratul Sharker    schedule 30.01.2020
comment
Terlihat benar dan elegan, tetapi saya mendapatkan kesalahan flat bukan fungsi. Apakah flat() aman digunakan? - person spacm; 30.01.2020
comment
Menurut MDN flat tidak tersedia di Edge & Internet explorer. developer.mozilla.org/en-US/ dokumen/Web/JavaScript/Referensi/ - person Ratul Sharker; 30.01.2020
comment
Oke, saya akan menghindarinya meskipun ini bukan browser favorit saya. Tapi makasih jawabannya, elegan banget. - person spacm; 30.01.2020

Ini seharusnya berhasil:

function prod(l1, l2) {
  return l2.reduce(
    (p, b) => p.concat(l1.map(a => [a, b])),
    [],
  );
}

const l1 = ['a','e','f'];
const l2 = ['1','3','2'];
const lp = prod(l1, l2);

console.log(lp);

person technophyle    schedule 30.01.2020

Anda dapat mengambil pendekatan yang berfungsi untuk lebih dari dua larik dengan mengurangi larik dan membuat larik baru.

let l1 = ['a','e','f'],
    l2 = ['1','3','2'],
    result = [l1, l2]
        .reduce((a, b) => a.reduce((r, v) => r.concat(b.map(w => [].concat(v, w))), []));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

person Nina Scholz    schedule 30.01.2020