我正在寻找一种简单的方法来执行以下操作。我尝试用lodash.reduce
来做到这一点,它很笨重,有没有更简单的方法。
发件人:
[{a: 'meow'}, {a: 'woof'}]
收件人:
{a: ['meow', 'woof']}
答案 0 :(得分:2)
您可以使用纯JS来做到这一点,而无需使用loadash。
在输入数组上调用数组的reduce
方法,并将该数组简化为一个对象,从而遍历内部objs的键:
const input = [{a: 'meow'}, {a: 'woof'}, {b: 'hi'}, {a: 'dog', c: 'bye'}, {}];
console.log(input.reduce((acc, val) => {
Object.keys(val).forEach(key => {
if(!acc[key]) {
acc[key] = [];
}
acc[key].push(val[key]);
});
return acc;
}, {}));
答案 1 :(得分:2)
您可以使用lodash#assignWith将所有属性各自的值分配到一个对象中,并使用定制程序函数来确定您想要如何构造该对象。
const result = _.assignWith({}, ...data, (v = [], s) => v.concat(s));
注意:为了确保我们不会突变data
数组中的任何对象,我传递了一个空对象作为第一个用作目标对象的参数。
const data = [
{ a: 'meow' },
{ a: 'woof', k: 'hey' },
{ k: 'yo', d: 'hehe' },
{ d: 'wazup', q: 'ohoho' }
];
const result = _.assignWith({}, ...data, (v = [], s) => v.concat(s));
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
答案 2 :(得分:0)
我在打字稿和lodash.reduce上遇到了一些问题,这行得通。
export function getFuncsObject(funcs): Record<Funcs, Case[]> {
let f = { ...funcs };
f = lodash.mapValues(f, () => []);
return f;
}
export function mockMerge(funcs, mocks: Record<Funcs, Case | null>[]): Record<Funcs, Case[]> {
const f = getFuncsObject(funcs);
lodash.each(mocks, (v, k) => {
f[k].push(v);
});
return f;
}
答案 3 :(得分:0)
一种选择是使用两种简化方法,如下所示:
const input = [{
a: 'meow'
}, {
a: 'woof'
}, {
b: 'moo'
}];
const result = input
.reduce((itemResult, item) => Object.keys(item)
.reduce((keyResult, key) => ({
...keyResult,
[key]: (keyResult[key] || []).concat(item[key])
}), itemResult), {});
console.log(result)
不确定与您当前的解决方案相比,它是否笨拙,但这很简洁,不需要外部库。
答案 4 :(得分:0)
不使用任何外部库或reduce。
const input = [ {a: 'meow'}, {a: 'woof'}, {b: 'hi'}, {a: 'dog', c: 'bye'}, {} ];
let output = {};
input.forEach((inputObj) => {
for(let key in inputObj){
if(!output[ key ]){
output[ key ] = [];
}
output[ key ].push(inputObj[key])
}
});
console.log(output);
答案 5 :(得分:-1)
[{a: 'meow'}, {a: 'woof'}].reduce((m, n) => ({...m, [Object.keys(n)[0]]: (m[Object.keys(n)[0]] && m[Object.keys(n)[0]].concat(Object.values(n)[0])) || [].concat(Object.values(n)[0])}), {})