[英]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);
在這里,我們將分組鍵設為數組中name
、 hobby
和age
屬性的 JSON 字符串。 和一些對象休息/傳播語法來復制人們的屬性而沒有太多冗余。
您可以使用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);
請注意,上面的代碼取決於對象中的屬性在每個對象中的順序相同(在示例數據中, name
, age
, hobby
)。 如果情況並非如此,您將需要使用命名屬性創建密鑰,例如:
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);
另請注意,以上所有代碼都取決於選擇不會出現在name
或hobby
值中的分隔符(我使用過#
)。 如果沒有合適的分隔符,那么使用JSON.stringify
類的JSON.stringify
來生成key
會更安全,例如您將使用的第二個代碼塊:
let key = JSON.stringify([name, age, hobby]);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.