使用lodash将包含数组的对象数组转换为唯一对象查找



如何用lodashcodes转化为result?

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'}
]

使用嵌套的Array.flatMap()调用(或lodash的_.flatMap())来迭代主数组和b对象,并使用Array.map()来迭代c数组,以创建具有bc值的所有组合的对象数组:

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)

使用纯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; }

最新更新