简单的方法将对象数组转换为带有组合键作为数组的对象

时间:2019-01-03 03:16:44

标签: javascript typescript lodash

我正在寻找一种简单的方法来执行以下操作。我尝试用lodash.reduce来做到这一点,它很笨重,有没有更简单的方法。

发件人:

[{a: 'meow'}, {a: 'woof'}]

收件人:

{a: ['meow', 'woof']}

6 个答案:

答案 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])}), {})