如何按某些属性值对对象数组进行分组

发布于 2025-01-14 17:50:12 字数 871 浏览 3 评论 0原文

我有两个数组。一个包含字符串的数组,其中包含名称(可能有空格):

let companies = ['Google', 'Coca Cola', 'Jonson & Jonson'];

另一个数组包含带有人的对象:

let employees = [
  {name: 'Alina', company: 'Google', id : 1},
  {name: 'Vika', company: 'Coca Cola', id : 2},
  {name: 'Alex', company: 'Jonson & Jonson', id : 3},
  {name: 'Vlad', company: 'Google', id : 4},
  {name: 'Fibi', company: 'Coca Cola', id : 5},
  {name: 'Joey', company: 'Google', id : 6},
];

我的任务是按名称对这些人进行分组:

const groups = [
 {'Google': [
   {name: 'Alina', company: 'Google', id : 1},
   {name: 'Vlad', company: 'Google', id : 4},
 ]},
 'Jonson & Jonso': [
   {name: 'Alex', company: 'Jonson & Jonson', id : 3},
 ]},
 ...
];

JavaScript 中最简单且无需额外迭代的方法是什么?

我可以使用嵌套循环,但它太复杂了。也许可以用lodash来做?

我将非常感谢任何建议。

I have two arrays. One array with strings which contains names (which may have spaces):

let companies = ['Google', 'Coca Cola', 'Jonson & Jonson'];

And another array contains objects with people:

let employees = [
  {name: 'Alina', company: 'Google', id : 1},
  {name: 'Vika', company: 'Coca Cola', id : 2},
  {name: 'Alex', company: 'Jonson & Jonson', id : 3},
  {name: 'Vlad', company: 'Google', id : 4},
  {name: 'Fibi', company: 'Coca Cola', id : 5},
  {name: 'Joey', company: 'Google', id : 6},
];

My task is to group those people by names:

const groups = [
 {'Google': [
   {name: 'Alina', company: 'Google', id : 1},
   {name: 'Vlad', company: 'Google', id : 4},
 ]},
 'Jonson & Jonso': [
   {name: 'Alex', company: 'Jonson & Jonson', id : 3},
 ]},
 ...
];

What is the simplest and without extra iterations way to this in JavaScript?

I could use a nested loop, but it would be too complicated. Maybe it's possible to do with lodash?

I will be very grateful for any advice.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

我的奇迹 2025-01-21 17:50:12

较新的 Object.groupBy 方法可以用于此目的。

const employees = [
  {name: 'Alina', company: 'Google', id : 1},
  {name: 'Vika', company: 'Coca Cola', id : 2},
  {name: 'Alex', company: 'Jonson & Jonson', id : 3},
  {name: 'Vlad', company: 'Google', id : 4},
  {name: 'Fibi', company: 'Coca Cola', id : 5},
  {name: 'Joey', company: 'Google', id : 6},
];
const res = Object.groupBy(employees, e => e.company);
console.log(res);

The newer Object.groupBy method can be used for this.

const employees = [
  {name: 'Alina', company: 'Google', id : 1},
  {name: 'Vika', company: 'Coca Cola', id : 2},
  {name: 'Alex', company: 'Jonson & Jonson', id : 3},
  {name: 'Vlad', company: 'Google', id : 4},
  {name: 'Fibi', company: 'Coca Cola', id : 5},
  {name: 'Joey', company: 'Google', id : 6},
];
const res = Object.groupBy(employees, e => e.company);
console.log(res);

幸福%小乖 2025-01-21 17:50:12

回到未来的答案:

数组对象上的新 group 方法尚未得到许多浏览器的支持,但很快就会出现(TC39 的第 3 阶段)并且已经在 polyfill core-js 中可用)。

这将允许您直接这样做:

employees.group(employee => employee.company);

或者甚至:

employees.group(({company}) => company);

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/group

A back to the future answer:

Not yet supported by lot of browsers but will come soon (Stage 3 for TC39) and already available in polyfill core-js) is the new group method on the array object.

This will allows you to do it directly like this:

employees.group(employee => employee.company);

or even:

employees.group(({company}) => company);

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/group

折戟 2025-01-21 17:50:12
let employees = [
  {name: 'Alina', company: 'Google', id : 1},
  {name: 'Vika', company: 'Coca Cola', id : 2},
  {name: 'Alex', company: 'Jonson & Jonson', id : 3},
  {name: 'Vlad', company: 'Google', id : 4},
  {name: 'Fibi', company: 'Coca Cola', id : 5},
  {name: 'Joey', company: 'Google', id : 6},
]
function groupBy(arr, property) {
    return arr.reduce(function (memo, x) {
        if (!memo[x[property]]) { memo[x[property]] = []; }
        memo[x[property]].push(x);
        return memo;
    }, {});
};
console.log(groupBy(employees,'company'));

let employees = [
  {name: 'Alina', company: 'Google', id : 1},
  {name: 'Vika', company: 'Coca Cola', id : 2},
  {name: 'Alex', company: 'Jonson & Jonson', id : 3},
  {name: 'Vlad', company: 'Google', id : 4},
  {name: 'Fibi', company: 'Coca Cola', id : 5},
  {name: 'Joey', company: 'Google', id : 6},
]
function groupBy(arr, property) {
    return arr.reduce(function (memo, x) {
        if (!memo[x[property]]) { memo[x[property]] = []; }
        memo[x[property]].push(x);
        return memo;
    }, {});
};
console.log(groupBy(employees,'company'));

半世晨晓 2025-01-21 17:50:12
let companies = ['Google', 'Coca Cola', 'Jonson & Jonson'];

let employees = [
  { name: 'Alina', company: 'Google', id: 1 },
  { name: 'Vika', company: 'Coca Cola', id: 2 },
  { name: 'Alex', company: 'Jonson & Jonson', id: 3 },
  { name: 'Vlad', company: 'Google', id: 4 },
  { name: 'Fibi', company: 'Coca Cola', id: 5 },
  { name: 'Joey', company: 'Google', id: 6 },
];

const groups = {};

employees.forEach((employee) => {
  const { company } = employee;
  if (!groups[company]) {
    groups[company] = [];
  }
  groups[company].push(employee);
});

console.log(groups);

let companies = ['Google', 'Coca Cola', 'Jonson & Jonson'];

let employees = [
  { name: 'Alina', company: 'Google', id: 1 },
  { name: 'Vika', company: 'Coca Cola', id: 2 },
  { name: 'Alex', company: 'Jonson & Jonson', id: 3 },
  { name: 'Vlad', company: 'Google', id: 4 },
  { name: 'Fibi', company: 'Coca Cola', id: 5 },
  { name: 'Joey', company: 'Google', id: 6 },
];

const groups = {};

employees.forEach((employee) => {
  const { company } = employee;
  if (!groups[company]) {
    groups[company] = [];
  }
  groups[company].push(employee);
});

console.log(groups);

魔法唧唧 2025-01-21 17:50:12

最简单的方法是:

let employees = [
  {name: 'Alina' company: 'Google', id : 1},
  {name: 'Vika' company: 'Coca Cola', id : 2},
  {name: 'Alex' company: 'Jonson & Jonson', id : 3},
  {name: 'Vlad' company: 'Google', id : 4},
  {name: 'Fibi' company: 'Coca Cola', id : 5},
  {name: 'Joey' company: 'Google', id : 6},
]

const grouped = groupBy(employees, employee => employee.company);

The simplest way would be:

let employees = [
  {name: 'Alina' company: 'Google', id : 1},
  {name: 'Vika' company: 'Coca Cola', id : 2},
  {name: 'Alex' company: 'Jonson & Jonson', id : 3},
  {name: 'Vlad' company: 'Google', id : 4},
  {name: 'Fibi' company: 'Coca Cola', id : 5},
  {name: 'Joey' company: 'Google', id : 6},
]

const grouped = groupBy(employees, employee => employee.company);
紫南 2025-01-21 17:50:12

由于您走的是简单路线,因此时间会稍长。

let companies = ['Google', 'Coca Cola,' 'Jonson & Jonson',];

let employees = [
  {name: 'Alina' company: 'Google', id : 1},
  {name: 'Vika' company: 'Coca Cola', id : 2},
  {name: 'Alex' company: 'Jonson & Jonson', id : 3},
  {name: 'Vlad' company: 'Google', id : 4},
  {name: 'Fibi' company: 'Coca Cola', id : 5},
  {name: 'Joey' company: 'Google', id : 6},
]

//Let's create an intermediate object 
let interm = {};
/*This would create an object like 
 {
 Key:[],
 Key2:[],
 ...
 }

*/
companies.forEach((each)=>{
    interm[`${each}`] = [];
})

/*filling that interm a
Object with values like

{
'Google':[
{name: 'Alina' company: 'Google', id : 1}, 
{name: 'Vlad' company: 'Google', id : 4},
{name: 'Joey' company: 'Google', id : 6}
],
 Coca Cola:[
{name: 'Vika' company: 'Coca Cola', id : 2},
  {name: 'Fibi' company: 'Coca Cola', id : 5},
],
"Jonson & Jonson":[
 {name: 'Alex' company: 'Jonson & Jonson', id : 3},
]    
}

*/

employee.forEach((each)=>{
    if(companies.indexOf(each.company) != -1)
    interm[`${each.company}`].push(each)

})

//Now our intermediate data is ready 
//We need to convert to our   desirable format
let finalArray = []
Object.keys(interm).forEach((each)=>{
    finalArray.push({each:interm[`${each}`]})
})

console.log(finalArray)

Since you are going the simple route it would be slightly long.

let companies = ['Google', 'Coca Cola,' 'Jonson & Jonson',];

let employees = [
  {name: 'Alina' company: 'Google', id : 1},
  {name: 'Vika' company: 'Coca Cola', id : 2},
  {name: 'Alex' company: 'Jonson & Jonson', id : 3},
  {name: 'Vlad' company: 'Google', id : 4},
  {name: 'Fibi' company: 'Coca Cola', id : 5},
  {name: 'Joey' company: 'Google', id : 6},
]

//Let's create an intermediate object 
let interm = {};
/*This would create an object like 
 {
 Key:[],
 Key2:[],
 ...
 }

*/
companies.forEach((each)=>{
    interm[`${each}`] = [];
})

/*filling that interm a
Object with values like

{
'Google':[
{name: 'Alina' company: 'Google', id : 1}, 
{name: 'Vlad' company: 'Google', id : 4},
{name: 'Joey' company: 'Google', id : 6}
],
 Coca Cola:[
{name: 'Vika' company: 'Coca Cola', id : 2},
  {name: 'Fibi' company: 'Coca Cola', id : 5},
],
"Jonson & Jonson":[
 {name: 'Alex' company: 'Jonson & Jonson', id : 3},
]    
}

*/

employee.forEach((each)=>{
    if(companies.indexOf(each.company) != -1)
    interm[`${each.company}`].push(each)

})

//Now our intermediate data is ready 
//We need to convert to our   desirable format
let finalArray = []
Object.keys(interm).forEach((each)=>{
    finalArray.push({each:interm[`${each}`]})
})

console.log(finalArray)
别把无礼当个性 2025-01-21 17:50:12

请注意,companys 是多余的,因为所有需要的信息都在 employees 中。

您正在寻找的结构可能是Map。您只需执行以下操作:

let map = new Map()
employees.forEach((currentValue) => {
    map.has(currentValue.company) 
    ? map.get(currentValue.company).push({name: currentValue.name, id: currentValue.id})
    : map.set(currentValue.company, [{name: currentValue.name, id: currentValue.id}])
});

即可获得此结果(employee 对象中不再需要字段 company):

{
  Coca Cola: [{
  id: 2,
  name: "Vika"
}, {
  id: 5,
  name: "Fibi"
}],
  Google: [{
  id: 1,
  name: "Alina"
}, {
  id: 4,
  name: "Vlad"
}, {
  id: 6,
  name: "Joey"
}],
  Jonson & Jonson: [{
  id: 3,
  name: "Alex"
}]
}

Please notice that companies is redundant, as all the needed info is in employees.

The structure that you are looking for is probably Map. You simply do:

let map = new Map()
employees.forEach((currentValue) => {
    map.has(currentValue.company) 
    ? map.get(currentValue.company).push({name: currentValue.name, id: currentValue.id})
    : map.set(currentValue.company, [{name: currentValue.name, id: currentValue.id}])
});

to get this result (field company won't be needed anymore in employee object):

{
  Coca Cola: [{
  id: 2,
  name: "Vika"
}, {
  id: 5,
  name: "Fibi"
}],
  Google: [{
  id: 1,
  name: "Alina"
}, {
  id: 4,
  name: "Vlad"
}, {
  id: 6,
  name: "Joey"
}],
  Jonson & Jonson: [{
  id: 3,
  name: "Alex"
}]
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文