|  | @@ -0,0 +1,100 @@
 | 
	
		
			
				|  |  | +<!--
 | 
	
		
			
				|  |  | + * @Author: your name
 | 
	
		
			
				|  |  | + * @Date: 2021-08-20 16:17:21
 | 
	
		
			
				|  |  | + * @LastEditTime: 2021-08-20 17:10:41
 | 
	
		
			
				|  |  | + * @LastEditors: Please set LastEditors
 | 
	
		
			
				|  |  | + * @Description: 
 | 
	
		
			
				|  |  | + * @FilePath: \md-\js\合并数组中的key值.md
 | 
	
		
			
				|  |  | +-->
 | 
	
		
			
				|  |  | +# 在js中合并两个数组中key值相同的项
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +## 前言
 | 
	
		
			
				|  |  | +风和日丽的一天,群里突然抛出一个问题,现在有一个数组,其中有多个项的key属性是一样的,现在需要进行合并
 | 
	
		
			
				|  |  | +示例代码结构
 | 
	
		
			
				|  |  | +```js
 | 
	
		
			
				|  |  | +// 输入的数据
 | 
	
		
			
				|  |  | +const arr = [
 | 
	
		
			
				|  |  | +    {key: 1, a: 'a'},
 | 
	
		
			
				|  |  | +    {key: 1, b: 'b'},
 | 
	
		
			
				|  |  | +    {key: 2, a: 'a'},
 | 
	
		
			
				|  |  | +    {key: 2, b: 'b', c: 'c'},
 | 
	
		
			
				|  |  | +    {key: 3, a: 'a', b: 'b'},
 | 
	
		
			
				|  |  | +    {key: 4, a: 'a', b: 'b'},
 | 
	
		
			
				|  |  | +]
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +需要的结果
 | 
	
		
			
				|  |  | +```js
 | 
	
		
			
				|  |  | +// 需要的结果
 | 
	
		
			
				|  |  | +const arr_res = [
 | 
	
		
			
				|  |  | +    {key: 1, a: 'a', b: 'b'},
 | 
	
		
			
				|  |  | +    {key: 2, a: 'a', b: 'b', c: 'c'},
 | 
	
		
			
				|  |  | +    {key: 3, a: 'a', b: 'b'},
 | 
	
		
			
				|  |  | +    {key: 4, a: 'a', b: 'b'},
 | 
	
		
			
				|  |  | +]
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +## 解决方案
 | 
	
		
			
				|  |  | +> [!tip]
 | 
	
		
			
				|  |  | +> 记录了大佬们的回答,都是用的上面的数据结构
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +### 使用reduce进行处理
 | 
	
		
			
				|  |  | +<!-- tabs:start -->
 | 
	
		
			
				|  |  | +#### **罗老师版本**
 | 
	
		
			
				|  |  | +这个版本为湿鸡老师所写
 | 
	
		
			
				|  |  | +```js
 | 
	
		
			
				|  |  | +var obj = arr.reduce((_,o)=>{
 | 
	
		
			
				|  |  | +    _[o.key] ? (_[o.key] = Object.assign(_[o.key],o)) : (_[o.key] = o);return _;
 | 
	
		
			
				|  |  | +},{})
 | 
	
		
			
				|  |  | +var a = [];
 | 
	
		
			
				|  |  | +for( var key in obj ){
 | 
	
		
			
				|  |  | +    a.push(obj[key])
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +console.log(a);
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +用reduce循环将key作为累加值的键,用`Object.assign`来处理key值相同的项.
 | 
	
		
			
				|  |  | +最后使用数组转换为
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#### **群宠晨晨大佬的一行版本**
 | 
	
		
			
				|  |  | +这个版本,为大佬所写,过于高端.和湿鸡老师写的有所不同,虽然同样是使用`reduce`,但是我特么一下真的看不懂.
 | 
	
		
			
				|  |  | +但是大佬有另一个版本
 | 
	
		
			
				|  |  | +```js
 | 
	
		
			
				|  |  | +arr.reduce((r, o) => ((r[o.key] = {...r[o.key], ...o}), r), []).filter(i => i)
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +在这个版本大佬看见数据结构的key值是用数字组成的,可以转换为数组下标
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#### **晨晨大佬的一行版本扩写**
 | 
	
		
			
				|  |  | +// 晨晨大佬一行版本修改
 | 
	
		
			
				|  |  | +let x2 = arr.reduce((r,o)=>{
 | 
	
		
			
				|  |  | +    // 通过解构进行合并不同的项
 | 
	
		
			
				|  |  | +    r[o.key] = {...r[o.key], ...o}
 | 
	
		
			
				|  |  | +    return r
 | 
	
		
			
				|  |  | +},[])
 | 
	
		
			
				|  |  | +// 因为key值不是百分百都对应数组的下标.所以用filter过滤
 | 
	
		
			
				|  |  | +x2 = x2.filter(i=>i)
 | 
	
		
			
				|  |  | +console.log(x2);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +<!-- tabs:end -->
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +### 其他方式处理
 | 
	
		
			
				|  |  | +> [!tip]
 | 
	
		
			
				|  |  | +> 其他的解决方法
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +<!-- tabs:start -->
 | 
	
		
			
				|  |  | +#### **晨晨大佬的mapFor版本**
 | 
	
		
			
				|  |  | +```js
 | 
	
		
			
				|  |  | +const map = new Map()
 | 
	
		
			
				|  |  | +let crt
 | 
	
		
			
				|  |  | +for (const item of arr) {
 | 
	
		
			
				|  |  | +    crt = map.get(item.key)
 | 
	
		
			
				|  |  | +    map.set(item.key, {...crt, ...item})
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +const res = [...map.values()]
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +使用map来替代对象,对象不好转化为数组,map的values函数可以返回所有的值
 | 
	
		
			
				|  |  | +<!-- tabs:ends -->
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +## 知识点总结
 | 
	
		
			
				|  |  | +### 1. `reduce`的使用
 | 
	
		
			
				|  |  | +### 2. 解构赋值
 | 
	
		
			
				|  |  | +### 3. `Map`的使用
 |