如何按集合中的相同键分组

时间:2019-12-26 09:16:56

标签: javascript lodash

假设以下对象

let oldArr = [
  { a: 1 },
  { a: 2 },
  { a: 3 },
  { b: 1 },
  { b: 2 },
  { c: 1 }
]

所需结果

let newArr = [
  [
    { a: 1 },
    { a: 2 },
    { a: 3 },
  ],
  [
    { b: 1 },
    { b: 2 },
  ],
  [
    { c: 1 }
  ],
]

我尝试使用lodash,我看到了 partition 函数,但是它仅将数组分为两组。 groupBy 通过键将其分组为一个对象。 有什么好办法吗?希望得到大家的帮助,谢谢!

3 个答案:

答案 0 :(得分:0)

就像这样:

let oldArr = [
  { a: 1 },
  { a: 2 },
  { a: 3 },
  { b: 1 },
  { b: 2 },
  { c: 1 }
]

let objects = {};

for (let item of oldArr) {
  // get key
  let key = Object.keys(item)[0];
  // check if this key added before
  if (!objects[key]) objects[key] = [];
  // push this object
  objects[key].push(item);
}

let newArr = Object.values(objects);

console.log(newArr)

但是您应该确保oldArr中的每个对象只有一个键。

答案 1 :(得分:0)

您可以使用Object.keysObject.valuesArray.reduce

let oldArr = [
  { a: 1 },
  { a: 2 },
  { a: 3 },
  { b: 1 },
  { b: 2 },
  { c: 1 },
  { a: 4, c: 2 }
]

let newArr = 
  // drop the keys of the object created by the reduce
  Object.values(
    // for each object in the array
    oldArr.reduce((acc, el) => {
      // for each keys in the object
      Object.keys(el).forEach(key => {
        // add the object to the group of objects with this key
        acc[key] = acc[key] || []
        acc[key].push(el)
      })
      return acc
    }, {})
  )

console.log(newArr)

如果输入中的对象具有多个键,它将进入输出中的每个组

答案 2 :(得分:0)

您可以那样使用

let oldArr = [
  { a: 1 },
  { a: 2 },
  { a: 3 },
  { b: 1 },
  { b: 2 },
  { c: 1 }
];
let newArr = {};
oldArr.forEach((i)=>{
  let key = Object.keys(i)[0];
  newArr[key] = newArr[key] || [];
  newArr[key].push(i);
});
newArr = Object.values(newArr);
console.log(newArr);