ผลคูณคาร์ทีเซียนจาวาสคริปต์ของรายการ

ฉันต้องการผลคูณคาร์ทีเซียนของรายการจาวาสคริปต์สองรายการ

ตัวอย่าง:

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

LP จะเป็น

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

ฉันสามารถทำได้ง่ายๆ ด้วย for/foreach ลูป แต่สงสัยว่ามีใครจะมีคำแนะนำที่สวยงามเกี่ยวกับฟังก์ชันแผนที่หรือไม่


person spacm    schedule 30.01.2020    source แหล่งที่มา


คำตอบ (4)


คุณสามารถใช้การรวมกันของการลดและแมป:

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

ลองดังต่อไปนี้

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
ดูถูกต้องและสง่างาม แต่ฉันได้รับแบนไม่ใช่ข้อผิดพลาดของฟังก์ชัน flat() ปลอดภัยในการใช้งานหรือไม่? - person spacm; 30.01.2020
comment
ตาม MDN flat ไม่สามารถใช้งานได้ใน Edge & Internet explorer developer.mozilla.org/en-US/ เอกสาร/เว็บ/JavaScript/ข้อมูลอ้างอิง/ - person Ratul Sharker; 30.01.2020
comment
โอเค ฉันจะหลีกเลี่ยง แม้ว่าเบราว์เซอร์เหล่านี้จะไม่ใช่เบราว์เซอร์ที่ฉันชื่นชอบก็ตาม แต่ขอบคุณสำหรับคำตอบ มันดูหรูหราจริงๆ - person spacm; 30.01.2020

สิ่งนี้ควรจะได้ผล:

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

คุณสามารถใช้แนวทางที่ใช้ได้กับอาร์เรย์มากกว่าสองตัวโดยการลดอาร์เรย์และสร้างอาร์เรย์ใหม่

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