Умножение 2-х массивов в JavaScript - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть 2 массива

array1 = ["a","b"]
array2 = [ ["1","2","3"],["10","11","12"]]

Требуемый вывод - это массив объектов

[
 {array1: a , array2: 1},
 {array1: a , array2: 2},
 {array1: a , array2: 3},

 {array1: b , array2: 10},
 {array1: b , array2: 11},
 {array1: b , array2: 12},
]

Есть ли краткий способ добиться этого вывода вместо вложенных циклов

Ответы [ 5 ]

0 голосов
/ 08 февраля 2019

Вы можете использовать .map() и .flat(), чтобы отобразить каждый элемент array2 для каждого элемента array1, а затем сгладить результирующий массив.

const array1 = ["a","b"]
const array2 = [ ["1","2","3"],["10","11","12"]]

let res = array1.map((array1, i) => array2[i].map(array2 => ({array1, array2}))).flat()

console.log(res)
0 голосов
/ 08 февраля 2019

Этот подход аналогичен Марксу Мейеру ответа, но вместо reduce().

используется forEach().

let array1 = ["a","b", "c"];
let array2 = [["1","2","3"], ["10","11","12"]];
let res = [];

array1.forEach((x, i) =>
{
    if (array2[i])
        res.push(...array2[i].map(y => ({array1: x, array2: y})));
});

console.log(res);
0 голосов
/ 07 февраля 2019

Вы можете просто использовать метод map () во втором массиве, а затем использовать другой метод map () для вложенных массивов.Наконец, используйте индексы для группировки «n-го» элемента из первого массива с элементами из «n-го» вложенного массива вместе внутри объекта, подобного этому:

array1 = ["a","b"]
array2 = [ ["1","2","3"],["10","11","12"]]
let x = [];

array2.map((e,i) => { // call function on every element in array2 with index callback
  e.map((f,j) => { // call function on every element in the nested arrays with index callback
    let obj = {};
    obj["array1"] = array1[i];
    obj["array2"] = f;
    x.push(obj);
  });
});

console.log(x);
0 голосов
/ 07 февраля 2019

Кажется, вам просто нужны две петли.Есть много способов сделать это.Краткий путь - reduce array1 и map array2 в результат во внешнем цикле:

let array1 = ["a","b"]
let array2 = [ ["1","2","3"],["10","11","12"]]

let res = array1.reduce((arr, array1, i) => 
  arr.concat(array2[i].map(array2 => ({array1, array2})))
, [])

console.log(res)
0 голосов
/ 07 февраля 2019

Вы можете уменьшить массивы и получить декартово произведение внешних элементов каждого массива.

function getCartesian(object) {
    return Object.entries(object).reduce((r, [k, v]) => {
        var temp = [];
        r.forEach(s =>
            (Array.isArray(v) ? v : [v]).forEach(w =>
                (w && typeof w === 'object' ? getCartesian(w) : [w]).forEach(x =>
                    temp.push(Object.assign({}, s, { [k]: x }))
                )
            )
        );
        return temp;
    }, [{}]);
}

var array1 = ["a", "b"],
    array2 = [["1", "2", "3"], ["10", "11", "12"]],
    result = array1.reduce((r, a, i) =>
        r.concat(getCartesian({ array1: a, array2: array2[i] })), [])

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...