javascript декартово произведение списков - PullRequest
2 голосов
/ 30 января 2020

мне понадобится декартово произведение двух javascript списков.

Пример:

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, но интересно, будут ли у кого-то элегантные предложения с функциями карты.

Ответы [ 4 ]

2 голосов
/ 31 января 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; }
2 голосов
/ 30 января 2020

Вы можете использовать комбинацию уменьшения и карты:

console.log(l1.reduce((result, el1) => {
  result.push(...l2.map((el2) => [el1, el2]));
  return result;
}, []));
2 голосов
/ 30 января 2020

Попробуйте следующим образом

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

console.log(l1.map(a => {
  return l2.map(b => {
    return [a,b];
  })
}).flat())
1 голос
/ 30 января 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...