Два foreach замена JS - PullRequest
       1

Два foreach замена JS

0 голосов
/ 17 января 2019

Не могли бы вы порекомендовать более элегантный способ обработки этих случаев?

const arr1 = [1, 2, 3];
const arr2 = ['a', 'b', 'c'];

const getCombinations = () => {
  const combinations = [];
  arr1.forEach(el1 => {
    arr2.forEach(el2 => {
      combinations.push({
        el1,
        el2
      });
    });
  });
  return combinations;
};

console.log(getCombinations());

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Вы можете сделать несколько более динамичный подход, сначала выбрав декартово произведение, а затем сопоставить объекты с требуемыми свойствами.

const
    cartesian = (a, b) => a.reduce((r, v) => r.concat(b.map(w => [].concat(v, w))), []),
    takeKeys = keys => a => Object.assign(...a.map((v, i) => ({ [keys[i]]: v })))
    array1 = [1, 2, 3],
    array2 = ['a', 'b', 'c'],
    result = [array1, array2]
        .reduce(cartesian)
        .map(takeKeys(['el1', 'el2']));
        
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 17 января 2019

Вы можете использовать Array.flatMap() с Array.map():

const arr1 = [1, 2, 3];
const arr2 = ['a', 'b', 'c'];

const getCombinations = (a, b) => 
  a.flatMap(el1 => b.map(el2 => ({ el1, el2 })));

const result = getCombinations(arr1, arr2);

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...