簡體   English   中英

如何按某些屬性值對對象數組進行分組

[英]How to group array of objects by certain property values

我有兩個 arrays。 一個包含名稱的字符串數組

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},
 ]},
 ...
]

也許任何人都知道如何以最簡單的方式做到這一點,而無需對 JS 進行額外的迭代? 我可以使用嵌套循環,但這太復雜了。 也許有可能與lodash 另請注意,公司名稱的字符串鍵可能包含空格。 將非常感謝任何建議。

回到未來的答案:

許多瀏覽器尚不支持,但很快就會出現(TC39 的第 3 階段)並且已經在 polyfill core-js 中可用)是數組對象上的新groupBy方法。

這將允許您直接這樣做:

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

甚至 :

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

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

 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},
]

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

伙計,如果你在提問之前甚至不檢查你的結構是否沒有錯誤,這似乎不尊重潛在的響應者。 非易失性:/

所以,有固定的變量:

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}]

請注意, companies是多余的,因為所有需要的信息都在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"
}]
}

因為你走的是簡單的路線,所以會有點長。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM