先看下数据截图
我想让这两个 数组对象合在一起 如果key 值相同 就保留上面得数据 这数据可能有多条 也有可能有10条数组对象 应该如何去做 完全没思路
先看下数据截图
我想让这两个 数组对象合在一起 如果key 值相同 就保留上面得数据 这数据可能有多条 也有可能有10条数组对象 应该如何去做 完全没思路
const obj1 = {a:1,b:2,c:3,d:4}
const obj2 = {a:10,c:10,z:100}
const newObj = Object.assign({},obj2,obj1)
// {a: 1, c: 3, z: 100, b: 2, d: 4}
8 回答4.7k 阅读✓ 已解决
6 回答3.4k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
上面以第二个数组为作基数据来合并的数据,类似 SQL 查询中
from b left join a
如果要把两边的所有数据合并起来,还需要检查哪些数据存在于
a
中而不存在于b
中基于上面的代码,可以在每次
aMap.get()
之后,调用aMap.delete()
把取过的数据删掉,那遍历完成之后剩下的,补充在r
之后就行这里使用了 ES2015 引入的 Map 对象,要搞明白这个东西,需要先了解 Map:Map - MDN。我比较喜欢看英文原版,但如果你想看中文版,可以在 Language 那里选。
这个类的构造函数是
Map([iterable])
,其中iterable
是一个数组,该数组的每个元素也是数组 ——[key, value]
这样的两个元素的数组。所以const pairs = ...
这里就是为了生成iterable
参数。a
是一个数组,a.map
是调用的 Array.prototype.map。这里的重点是搞明白.map
的参数,那个callback
干什么。对于
[{ a: 1, b: 2, value: 3}, { a: 2, b: 3, value: 4}]
这样一个数组来说,第 1 个t => [t[key], t]
转换(假设 key === 'a')会得到:[1, { a: 1, value: 3}]
。这里要说明一点,后面改为多 KEY 的时候,这里的 key 要换成你想要的值,也就是
你自己模拟一下处理过程,第一个元素,可以看到
getKey
干的事情是,遍历["a", "b"]
,产生一个这样的转换转换方法:
key => model[key]
,对象{ a: 1, b: 2, value: 3}
所以:
"a"
=>1
"b"
=>2
最后
join
得到"1|2"
那么
pairs
的第 1 个元素就是["1|2", { a: 1, b: 2, value: 3}]
最终从
pairs
构造出的Map
对象是这样一个映射关系"1|2"
=>{ a: 1, b: 2, value: 3}
"2|3"
=>{ a: 2, b: 3, value: 4}
从这个映射表对象,只要能生成 key,就能查到原对象(用
aMap.get(...)
)这里也是一个 map 转换,从
t
转换成{...t, ...(aMap.get(t[key]) || {})}
,这里{...a, ...b}
用到了 Spread 语法。简单的说,就是把对象展开,所有属性组合起来形成新对象。转换结果是两个部分组成
...t
和...(...)
,前面很好理解,就是直接把 t 展开;后面部分就是在查表这里不得不说,
t[key]
要改成getKey(t)
,因为我们需要得到"1|2"
这样的东西,在aMap
中去找相应的对象。如果找到了,直接展开拼接属性,如果有同名属性,覆盖(Spread 语法)。但是有可能会找不到,那
aMap.get(...)
会返回undefined
。但是...undefined
是语法错误,所以需要把undefined
处理成空对象{}
,也就是... || {}
。总结一下,这里涉及到了这么一些知识
相关知识可以看我的博客: