簡體   English   中英

按對象按數組對象分組

[英]Group by array object by object

我有一個這樣的對象數組:

[{ name: 'Peter', age: '22',  hobby: 'soccer', city: 'london' }, 
 { name: 'Mario', age: '30',  hobby: 'bike', city: 'Paris' }, 
 { name: 'Peter', age: '22',  hobby: 'soccer', city: 'Paris' }, 
 { name: 'Mario', age: '30',  hobby: 'bike', city: 'Madrid' }, 
 { name: 'Rick', age: '28',  hobby: 'tennis', city: 'Berlin' }],

我想按城市分組,如下所示:

[{name: 'Peter', age: '22',  hobby: 'soccer', cities: ['london', 'Paris']},
 {name: 'Mario', age: '30',  hobby: 'bike',cities: ['Paris', 'Madrid']}, 
 {name: 'Rick', age: '28',  hobby: 'tennis', cities: ['Berlin']}]

我嘗試使用這個函數,我沒有好的數組


let arrayPeople = [{ name: 'Peter', age: '22',  hobby: 'soccer', city: 'london' }, 
 { name: 'Mario', age: '30',  hobby: 'bike', city: 'Paris' }, 
 { name: 'Peter', age: '22',  hobby: 'soccer', city: 'Paris' }, 
 { name: 'Mario', age: '30',  hobby: 'bike', city: 'Madrid' }, 
 { name: 'Rick', age: '28',  hobby: 'tennis', city: 'Berlin' }],

 let groups = {};
 for (let i = 0; i < arrayPeople.length; i++) {
   let groupName = arrayPeople[i].city;
   if (!groups[groupName]) {
    groups[groupName] = [];
   }
   groups[groupName].push(arrayPeople[i].city);
 }
 let arrayGroupBy= [];
 for (let groupName in groups) {
   arrayGroupBy.push({ ...arrayPeople, cities: groups[groupName] });
 }

我怎樣才能讓我的小組通過?

感謝您的幫助。

您的方法非常接近正確的解決方案。 您正在按城市對人員進行分組。 你必須轉身,按人分組城市

let arrayPeople = [{ name: 'Peter', age: '22',  hobby: 'soccer', city: 'london' }, 
 { name: 'Mario', age: '30',  hobby: 'bike', city: 'Paris' }, 
 { name: 'Peter', age: '22',  hobby: 'soccer', city: 'Paris' }, 
 { name: 'Mario', age: '30',  hobby: 'bike', city: 'Madrid' }, 
 { name: 'Rick', age: '28',  hobby: 'tennis', city: 'Berlin' }];

let groups = {};
for (let i = 0; i < arrayPeople.length; i++) {
  let groupName = arrayPeople[i].name;
  if (!groups[groupName]) {
   groups[groupName] = {name: arrayPeople[i].name, age: arrayPeople[i].age, hobby: arrayPeople[i].hobby, cities: []};
  }
  groups[groupName].cities.push(arrayPeople[i].city);
}
 
console.log(Object.values(groups));

這是 TypeScript,所以我可能會想出與最終數組元素相對應的類型:也就是說,刪除city屬性並添加一個cities屬性:

type PersonCities = Omit<typeof arrayPeople[number], "city"> & { cities: string[] };

然后,您想將所有對象放入以您希望分組條件為鍵的字典中(轉換為字符串):

const peopleCities: Record<string, PersonCities> = {};
for (let p of arrayPeople) {
  const { city, ...person } = p;
  const groupByKey = JSON.stringify([person.name, person.hobby, person.age]);
  if (!(groupByKey in peopleCities)) {
    peopleCities[groupByKey] = { ...person, cities: [] };
  }
  peopleCities[groupByKey].cities.push(city);
}
const arrayPeopleCities = Object.values(peopleCities);

在這里,我們將分組鍵設為數組中namehobbyage屬性的 JSON 字符串。 和一些對象休息/傳播語法來復制人們的屬性而沒有太多冗余。

Playground 鏈接到代碼

您可以使用Array.reduce處理您的輸入數組,使用名稱、年齡和愛好作為鍵來創建分組對象,並將每個鍵的城市添加到該對象中的數組中。 然后,您可以使用Object.values將分組對象中的值抓取到數組中:

 let arrayPeople = [{ name: 'Peter', age: '22', hobby: 'soccer', city: 'london' }, { name: 'Mario', age: '30', hobby: 'bike', city: 'Paris' }, { name: 'Peter', age: '22', hobby: 'soccer', city: 'Paris' }, { name: 'Mario', age: '30', hobby: 'bike', city: 'Madrid' }, { name: 'Rick', age: '28', hobby: 'tennis', city: 'Berlin' }]; let arrayGroupBy = Object.values(arrayPeople.reduce((c, { city, ...rest }) => { let key = Object.values(rest).join('#'); c[key] = c[key] || { ...rest, city : [] }; c[key].city.push(city); return c; }, {})); console.log(arrayGroupBy);

請注意,上面的代碼取決於對象中的屬性在每個對象中的順序相同(在示例數據中, nameagehobby )。 如果情況並非如此,您將需要使用命名屬性創建密鑰,例如:

 let arrayPeople = [{ name: 'Peter', age: '22', hobby: 'soccer', city: 'london' }, { age: '30', hobby: 'bike', name: 'Mario', city: 'Paris' }, { name: 'Peter', hobby: 'soccer', city: 'Paris', age: '22' }, { name: 'Mario', age: '30', hobby: 'bike', city: 'Madrid' }, { name: 'Rick', age: '28', hobby: 'tennis', city: 'Berlin' }]; let arrayGroupBy = Object.values(arrayPeople.reduce((c, { name, age, hobby, city}) => { let key = `${name}#${age}#${hobby}`; c[key] = c[key] || { name, age, hobby, city : [] }; c[key].city.push(city); return c; }, {})); console.log(arrayGroupBy);

另請注意,以上所有代碼都取決於選擇不會出現在namehobby值中的分隔符(我使用過# )。 如果沒有合適的分隔符,那么使用JSON.stringify類的JSON.stringify來生成key會更安全,例如您將使用的第二個代碼塊:

let key = JSON.stringify([name, age, hobby]);

暫無
暫無

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

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