如何根据对象属性从对象数组中创建新数组
按对象属性分组数组的几种实用方法
嘿,这问题我太懂了!要把你的Object1实例数组按property1(比如你的id_1这类标识)拆分成多组,JavaScript里有几个非常顺手的方案,我结合你的例子给你演示下:
方法一:使用Array.reduce()(最常用)
reduce()是ES6+里处理这类分组需求的经典工具,它能帮我们遍历数组的同时,构建一个以property1值为键、对应分组数组为值的对象,最后提取对象的取值就能得到分组后的数组列表啦。
代码示例:
// 先定义你的构造函数 function Object1(property1, property2, property3) { this.property1 = property1; this.property2 = property2; this.property3 = property3; } // 示例数组(模拟你创建的多个Object1实例) const objArray = [ new Object1('id_1', 'some_value_1', 'some_value_2'), new Object1('id_2', 'some_value_3', 'some_value_4'), new Object1('id_1', 'some_value_5', 'some_value_6'), new Object1('id_3', 'some_value_7', 'some_value_8'), new Object1('id_2', 'some_value_9', 'some_value_10') ]; // 按property1分组 const groupedObj = objArray.reduce((acc, currentItem) => { // 获取当前对象的分组标识键 const groupKey = currentItem.property1; // 如果缓存对象里还没有这个键,先初始化一个空数组 if (!acc[groupKey]) { acc[groupKey] = []; } // 把当前对象push到对应的分组数组里 acc[groupKey].push(currentItem); return acc; }, {}); // 如果需要得到纯分组数组列表(而非键值对对象) const groupedArrays = Object.values(groupedObj); console.log(groupedArrays); // 输出结果: // [ // [Object1 {property1: 'id_1', ...}, Object1 {property1: 'id_1', ...}], // [Object1 {property1: 'id_2', ...}, Object1 {property1: 'id_2', ...}], // [Object1 {property1: 'id_3', ...}] // ]
方法二:使用Map(保留键的插入顺序)
如果你需要严格保留分组键的插入顺序(比如先出现的id_1组始终排在最前面),用Map会更合适——普通对象的键顺序在早期JS里是不确定的,而Map会完全按照键的插入顺序保存。
代码示例:
const groupedMap = objArray.reduce((map, currentItem) => { const groupKey = currentItem.property1; // 如果Map里没有这个键,先设置一个空数组 if (!map.has(groupKey)) { map.set(groupKey, []); } map.get(groupKey).push(currentItem); return map; }, new Map()); // 转成纯分组数组列表 const groupedArraysFromMap = Array.from(groupedMap.values()); // 也可以直接通过键快速获取对应分组 console.log(groupedMap.get('id_1')); // 输出所有property1为id_1的对象
小提示
- 如果你的
property1是复杂类型(比如对象),优先用Map——因为普通对象的键只能是字符串或Symbol,而Map支持任意类型作为键。 - 如果你用的是ES2023及以上版本,还可以用原生的
Object.groupBy(),代码更简洁:
// ES2023+ 原生分组方法 const groupedByNative = Object.groupBy(objArray, item => item.property1); const groupedArraysNative = Object.values(groupedByNative);
内容的提问来源于stack exchange,提问作者SQLiteNoob
相关产品推荐
相关产品推荐

