简体   繁体   English

JavaScript:按 object 中的属性对对象数组进行分组

[英]JavaScript: group array of objects by property in an object

if I have a js array like below, is there a simple way to re-group the array values by age?如果我有一个像下面这样的 js 数组,有没有一种简单的方法可以按年龄重新分组数组值? I tried to reduce it to an array but it did not help.我试图将它减少为一个数组,但它没有帮助。 it's re-grouped with age or name's它按年龄或姓名重新分组

let employees = [
 {
  firstName:"Zion",
  lastName: "Rosy",
  age: 25,
  joinedDate:"January 24, 2020",
 },

 {
  firstName: "Ana",
  lastName: "Rosy",
  age: 25,
  joinedDate: "January 15, 2019",
 },

 {
  firstName: "Zion",
  lastName:"Albert",
  age: 30,
  joinedDate:"February 15, 2011",
 },
];

To re-group by age like this:像这样按年龄重新分组:

let organizedByAge =
 {
  25: [
 {
  firstName:"Zion",
  lastName: "Rosy",
  age: 25,
  joinedDate:"January 24, 2020",
 },
 {
  firstName: "Ana",
  lastName: "Rosy",
  age: 25,
  joinedDate: "January 15, 2019",
 },
  ],

  30: [
   {
    firstName:"Zion",
    lastName:"Albert",
    age: 30,
    joinedDate:"February 15, 2011",
   },
  ],
 };

is there a simple way to re-group the array values by age?有没有一种简单的方法可以按年龄重新分组数组值?

When rewriting arrays and objects, the most straightforward and readable approach is often to use a simple for loop:在重写 arrays 和对象时,最直接和可读的方法通常是使用简单for循环:

for (let i = 0; i < employees.length; i++) {
  
  const age = employees[i]['age'];
  
  if (organizedByAge.hasOwnProperty(age)) {
    organizedByAge[age].push(employees[i]);
  }
  
  else {
    organizedByAge[age] = [];
    organizedByAge[age][0] = employees[i];
  }
}

Working Example:工作示例:

 let employees = [ { firstName:"Zion", lastName: "Rosy", age: 25, joinedDate:"January 24, 2020", }, { firstName: "Ana", lastName: "Rosy", age: 25, joinedDate: "January 15, 2019", }, { firstName: "Zion", lastName:"Albert", age: 30, joinedDate:"February 15, 2011", }, ]; let organizedByAge = {}; for (let i = 0; i < employees.length; i++) { const age = employees[i]['age']; if (organizedByAge.hasOwnProperty(age)) { organizedByAge[age].push(employees[i]); } else { organizedByAge[age] = []; organizedByAge[age][0] = employees[i]; } } console.log(organizedByAge);

const groupByKey = (_data, _key) => {
  return _data.reduce((result, next) => {
    const key = next[_key];
    result[key] = result[key]?.length ? [...result[key], next] : [next];
    return result;
  }, {});
  }

 console.warn(groupByKey(employees, 'age'));

Using Array#reduce :使用Array#reduce

 const employees = [ { firstName:"Zion", lastName: "Rosy", age: 25, joinedDate:"January 24, 2020" }, { firstName: "Ana", lastName: "Rosy", age: 25, joinedDate: "January 15, 2019" }, { firstName: "Zion", lastName:"Albert", age: 30, joinedDate:"February 15, 2011" } ]; const organizedByAge = employees.reduce((map, e) => ({...map, [e.age]: [...(map[e.age]?? []), e] }), {}); console.log(organizedByAge);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM