下面是一个解决方法的代码示例:
function groupBy(arr, props) {
// 如果props为空数组,则返回原始数组
if (props.length === 0) {
return arr;
}
// 根据第一个属性进行分组
const grouped = arr.reduce((result, obj) => {
const prop = props[0];
const value = obj[prop];
if (!result[value]) {
result[value] = [];
}
result[value].push(obj);
return result;
}, {});
// 递归地对每个分组进行排序和分组
Object.keys(grouped).forEach(key => {
grouped[key] = groupBy(grouped[key], props.slice(1));
});
return grouped;
}
// 示例用法
const arr = [
{ type: 'fruit', category: 'apple', color: 'red' },
{ type: 'fruit', category: 'banana', color: 'yellow' },
{ type: 'veggie', category: 'carrot', color: 'orange' },
{ type: 'veggie', category: 'broccoli', color: 'green' },
];
const grouped = groupBy(arr, ['type', 'category', 'color']);
console.log(grouped);
输出结果如下:
{
fruit: {
apple: {
red: [
{ type: 'fruit', category: 'apple', color: 'red' }
]
},
banana: {
yellow: [
{ type: 'fruit', category: 'banana', color: 'yellow' }
]
}
},
veggie: {
carrot: {
orange: [
{ type: 'veggie', category: 'carrot', color: 'orange' }
]
},
broccoli: {
green: [
{ type: 'veggie', category: 'broccoli', color: 'green' }
]
}
}
}
以上代码中的groupBy
函数接受一个数组arr
和一个属性数组props
作为参数。它首先根据props
数组的第一个属性对arr
进行分组,然后递归地对每个分组的数组进行排序和分组,直到props
数组为空。最后返回分组结果。
在示例中,我们将arr
数组按照type
、category
和color
属性进行分组。输出结果按照这些属性的顺序递归地将数组分组,最终得到按特定顺序分组的结果。
上一篇:按特定顺序迭代数组元素