一个JavaScript数组去重的例子,看不大懂
在MDN看到的一个例子,新手前端有点儿看不懂,希望有人可以稍微指点一下?
function combine(){
let arr = [].concat.apply([], arguments); //没有去重复的新数组
return Array.from(new Set(arr));
}
var m = [1, 2, 2], n = [2,3,3];
console.log(combine(m,n)); // [1, 2, 3]
主要是 combine(m,n)
这里有点不大明白参数是怎么传入函数的?
还有 let arr = [].concat.apply([], arguments)
这里也不大明白实现原理
以及为什么不直接[...new Set(arr)]
来进行数组去重啊?上面的方法比这种要好在哪里呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
combine
函数没有定义参数,是直接从arguments
里面取的,这样更具灵活性,同样也会让调用者不明白这个函数的到底应该怎么传参,这个还是看自己怎么取舍吧。使用arguments
,你可以传入多个数组,不限制于参数列表。[].concat.apply([], arguments)
,是因为arguments
不是数组,只算是个类数组,使用使用apply
的方法,将参数里面的多个数组进行concat
合并。new Set(arr)
对数组去重,出重完成后返回的值也是类数组,所以再加一层Array.from
,保证最后输出的是数组形式。不知道这样讲,你没有清楚。
arguments是你的参数的一个类数组, 像数组, 但不是数组。 比如你传入的m,n, 那么arguments就是[m,n], 但不是真的数组, 可以自己去看下这个概念。
[].concat.apply([], arguments)上面说了arguments是一个类数组, 所以它并没有concat方法, 需要用[].concat.apply([])这种方式来调用一个concat方法, 关于这个, 看看apply,call这些概念就能懂了
arguments 就等于是任何未知形参,你可以传(String, Boolean,Array)
apply
和call
你可以谷歌了解下 无非就是改变函数this指向,借用方法这里
[].cancat.apply
你可以把他看成是借用数组合并方法来操作形参数组[1,2,2,2,3,3]
Array.from(new Set(arr))
这里是es6
的数组去重写法也可以写成
[...new Set(arr)]
combine
执行
combine(m,n)
arguments
是指传入的数据构成的数组可以用
arguments[0]
来获取第一个参数m可以用
arguments[1]
来获取第二个参数,applay 是指调用这个方法,有两个参数
[1,2,3]
到时候会给fun(1,2,3)
这样传递进去。[].concat.apply([], arguments)
翻译如下[].concat.apply([], [m, n])
[].concat(m,n)
(其实我没看懂为什么要多此一举 )1.使用[].concat.apply([],arguments);更具灵活性,调用combine函数时可以传递多个参数,包括可以传入非数组参数。
2.(...new Set(arr))当然也可以,方法不同而已,不存在为什么
3.你似乎不太懂arguments,建议看看相关文档,简单来说就是里面包含了传递给函数的实参,是一个类数组对象。
也没什么。
这里主要用了Set这个东西,集合的特点就是没有重复的元素;
然后使用Array.from来处理类数组;
而[].concat.apply([], arguments)就是使用了apply方法处理function combine() {}中传入的参数,
而concat,就是用来将两个数组拼接成一个数组,处理传入的参数可能是一个数组的情况。