Как бы вы превратили codes в result с помощью lodash?

const codes = [
   {a: 'aa', b: [ 8518 ], c: [ '2146' ]},
   {a: 'bb', b: [ 120123 ], c: [ 'D835', 'DD3B' ]},
   {a: 'cc', b: [ 168, 532 ], c: [ '00A8' ] }
]

const result = [
   {a: 'aa', b:8518, c:'2146'},
   {a: 'bb', b:120123, c:'D835'},
   {a: 'bb', b:120123, c:'DD3B'},
   {a: 'cc', b:168, c:'00A8'},
   {a: 'cc', b:532, c:'00A8'}
]
-2
Adam 12 Фев 2021 в 22:58

2 ответа

Лучший ответ

Используйте вложенные вызовы Array.flatMap() (или _.flatMap() lodash) для итерации основного массива и объектов b и Array.map() для итерации массивов c для создания массив объектов со всеми комбинациями значений b и c:

const codes = [{ a: 'aa', b: [8518], c: ['2146'] }, { a: 'bb', b: [120123], c: ['D835', 'DD3B'] }, { a: 'cc', b: [168, 532], c: ['00A8'] }]

const result = codes.flatMap(o =>
  o.b.flatMap(b => 
    o.c.map(c => ({ ...o, b, c }))
  )
)

console.log(result)
1
Ori Drori 13 Фев 2021 в 10:41

С помощью простого Javascript вы можете разделить проблему на две задачи: одну для построения декартового произведения массива с вложенной структурой, а другую - для отображения частичного результата декартовых произведений.

getCartesian - это рекурсивная функция, которая разделяет все пары ключ / значение и строит новый декартово произведение путем итерации значений, если массив с объектами снова вызывает getCartesian и создает новые объекты.

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 input =  [{ a: 'aa', b: [8518], c: ['2146'] }, { a: 'bb', b: [120123], c: ['D835', 'DD3B'] }, { a: 'cc', b: [168, 532], c: ['00A8'] }],
    cartesian = input.flatMap(o => getCartesian(o));

console.log(cartesian);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1
Nina Scholz 12 Фев 2021 в 20:07