请问 JS 如何合并这样的两个数组

2021-08-11 09:30:27 +08:00
 muunala10221
let a = [[123, ''],[456, ''],[789, '']]
let b = [[123, 1],[456, 1] ]

a 一定包含 b 的所有值,想要把 ab 合并 ,最后变成 [[123, ''],[456, 1],[789, ''],我知道循环可以做到,但是想看看有啥更优雅的实现方法没
1742 次点击
所在节点    JavaScript
16 条回复
codehz
2021-08-11 09:46:02 +08:00
[...new Map([...a, ...b])]
neekeV2
2021-08-11 10:30:51 +08:00
@codehz 这什么骚操作
otakustay
2021-08-11 10:54:35 +08:00
@neekeV2 利用 Map 在 key 相同的时候会后者覆盖前者呗
sgiyy
2021-08-11 10:55:16 +08:00
[123, ''] [123, 1] > [123, '']
[456, ''] [456, 1] > [456, 1]

这是什么回事?
muunala10221
2021-08-11 11:20:23 +08:00
@sgiyy 打错咯 应该是 [[123, 1],[456, 1],[789, '']]
muunala10221
2021-08-11 11:20:30 +08:00
@codehz 感谢
libook
2021-08-11 11:51:18 +08:00
#1 楼是把[123,""]这种数组的第 0 位元素作为 Map 的 key,第 1 位元素作为 Map 的 value,挺巧妙的。
Map 对比 key 一样不一样的时候用的是 Object.is ,几乎和强逻辑等===是一样的,只不过在+0 、-0 以及 NaN 上结果不一样,所以如果是[[123],""]这种更复杂的形态就不行了。

同理,有个更简单的写法,是利用的 Object 里 key 唯一的原理:
Object.assign([],a,b);
能某种程度上解决上面的问题,但也不能说这个就是很稳的方法,这种用法肯定不是语言本身设计的初衷,得了解清楚为什么是这个结果才行,比如 key 为什么能判定为一样( ES2022 没有写明判断细节,只在 10.1.5.1 (2) 一句“If O does not have an own property with key P, return undefined.” 所以很可能未来引擎实现变化了,这个结果也会变化),上游原型上的 key 是否也可以,遇到 getter 、setter 会不会有问题,数组里的元素是引用的时候是否有问题。

不知道题主怎么定义“优雅”,这么做很巧妙,但是团队协作的时候不容易看懂,你最好多写一些注释标明这一句是在干嘛……
libook
2021-08-11 12:42:37 +08:00
@libook #7 额,我给的答案有问题,Object.assign 是直接识别的数组 index,比如[[123], '']在 a 数组里的 index 是 0,[123, 1]在 b 数组里的 index 是 0,assign 单纯把 b 的 0 位元素覆盖到了 a 的 0 位元素,如果把数组内元素的顺序打乱,就不行了……
muunala10221
2021-08-11 14:11:06 +08:00
@libook 好的 谢谢你
jjwjiang
2021-08-11 15:16:21 +08:00
@codehz 这个不是有明显的问题吗?如果楼主给的数组第二项不一样的话也会合并覆盖了,这个写法只看每个元素的第一项
muunala10221
2021-08-11 17:16:51 +08:00
@jjwjiang 嗯嗯,我期望的就是这样,需求是前端监控页面,近七天数据图表,后端说可能无法从普罗米修斯获取近 7 天的全部数据,中途机器可能 down 掉,这时需要我从用户选择的时间起止范围计算时间戳 360 个点,再和后端接口对比,后端返回有数据的点我放在这 360 个点中,所以数组 1 下标不太重要 只要 0 相同的合并就好啦
UnitTest
2021-08-11 19:33:35 +08:00
我没看懂题目啊,a 一定包含 b, 那 ab 还有什么合并的意义呢?
UnitTest
2021-08-11 19:35:10 +08:00
哦,明白了,二维数组里面第 0 个元素其实是 Key,第 1 个元素其实是 value 。
shilianmlxg
2021-08-12 08:40:24 +08:00
我记得 lodash 有 api ( cv 工程师的肯定)
lin07hui
2021-08-16 11:49:59 +08:00
@shilianmlxg _.uniqBy([...b, ...a], '0')
shilianmlxg
2021-08-16 12:04:16 +08:00
@lin07hui 谢谢大佬

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/794990

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX