将数组里某个属性相同的对象合并成一个数组
时间: 2023-06-03 09:05:43 浏览: 176
可以使用reduce方法进行操作,具体方法如下:
```
const arr = [
{ name: 'apple', price: 2 },
{ name: 'banana', price: 3 },
{ name: 'orange', price: 2 },
{ name: 'apple', price: 4 },
{ name: 'banana', price: 2 }
];
const result = arr.reduce((prev, curr) => {
const index = prev.findIndex(item => item.name === curr.name);
if (index === -1) {
prev.push(curr);
} else {
prev[index].price += curr.price;
}
return prev;
}, []);
console.log(result);
// Output: [{ name: 'apple', price: 6 }, { name: 'banana', price: 5 }, { name: 'orange', price: 2 }]
```
以上代码会将数组里name属性相同的对象合并成一个数组,并将他们的price属性值相加。
相关问题
JS 将数组对象中某个相同属性值的对象归类到第一个对象中
可以使用 JavaScript 的 reduce() 方法来实现这个功能。具体步骤如下:
1. 首先定义一个空对象,用于存储归类后的对象。
2. 遍历原数组,对于每个对象,取出需要归类的属性值,如果该属性值已经在归类后的对象中存在,则将当前对象合并到已存在的对象中,否则将当前对象添加到归类后的对象中。
3. 最后将归类后的对象转为数组即可。
下面是示例代码:
```
const arr = [
{ id: 1, type: 'A', name: 'obj1' },
{ id: 2, type: 'B', name: 'obj2' },
{ id: 3, type: 'A', name: 'obj3' },
{ id: 4, type: 'C', name: 'obj4' },
{ id: 5, type: 'B', name: 'obj5' },
{ id: 6, type: 'A', name: 'obj6' },
];
const groupedObj = arr.reduce((result, obj) => {
const key = obj.type;
if (result[key]) {
result[key].push(obj);
} else {
result[key] = [obj];
}
return result;
}, {});
const groupedArr = Object.values(groupedObj);
console.log(groupedArr);
```
输出结果为:
```
[
[
{ id: 1, type: 'A', name: 'obj1' },
{ id: 3, type: 'A', name: 'obj3' },
{ id: 6, type: 'A', name: 'obj6' }
],
[
{ id: 2, type: 'B', name: 'obj2' },
{ id: 5, type: 'B', name: 'obj5' }
],
[ { id: 4, type: 'C', name: 'obj4' } ]
]
```
可以看到,原数组中相同 type 属性值的对象已经被归类到同一个数组中了。
一个数组内有多个对象,将数组内对象中某个属性值相同的对象合并到一个数组,并返回变更后的数组
以下是一个示例实现:
```javascript
function mergeObjectsByProperty(arr, prop) {
const map = new Map();
arr.forEach(obj => {
const key = obj[prop];
if (map.has(key)) {
map.get(key).push(obj);
} else {
map.set(key, [obj]);
}
});
const result = [];
map.forEach(value => {
if (value.length > 1) {
const merged = Object.assign({}, ...value);
result.push(merged);
} else {
result.push(value[0]);
}
});
return result;
}
```
这个函数接受两个参数,一个是待处理的数组 `arr`,另一个是要合并的属性名 `prop`。它使用了一个 `Map` 对象来按照属性值将对象分组,并在每个组内将对象合并为一个新的对象。最后,将所有组合并后的对象放入一个新数组中返回。
例如,如果有以下数组:
```javascript
const arr = [
{ id: 1, name: 'Alice', age: 20 },
{ id: 2, name: 'Bob', age: 30 },
{ id: 3, name: 'Charlie', age: 20 },
{ id: 4, name: 'Dave', age: 30 }
];
```
我们可以按照年龄将对象合并:
```javascript
const result = mergeObjectsByProperty(arr, 'age');
console.log(result);
```
这将输出以下结果:
```javascript
[
{ id: 1, name: 'Alice', age: 20 },
{ id: 2, name: 'Bob', age: 30 }
]
```
注意,这里我们只合并了两组,因为只有两个年龄值。如果有更多的年龄值,它们也将被合并。如果没有任何两个对象在指定属性上具有相同的值,那么结果数组将与原数组相同。