一个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)] 来进行数组去重啊?上面的方法比这种要好在哪里呢?

阅读 3.6k
6 个回答
  1. combine函数没有定义参数,是直接从arguments里面取的,这样更具灵活性,同样也会让调用者不明白这个函数的到底应该怎么传参,这个还是看自己怎么取舍吧。使用arguments,你可以传入多个数组,不限制于参数列表。
  2. [].concat.apply([], arguments),是因为arguments不是数组,只算是个类数组,使用使用apply的方法,将参数里面的多个数组进行concat合并。
  3. 最后通过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)
applycall你可以谷歌了解下 无非就是改变函数this指向,借用方法
这里[].cancat.apply你可以把他看成是借用数组合并方法来操作形参数组[1,2,2,2,3,3]
Array.from(new Set(arr))这里是es6的数组去重写法
也可以写成[...new Set(arr)]

  1. 声明了一个方法 combine
  2. m 和 n 赋值
  3. 执行combine(m,n)

    1. arguments 是指传入的数据构成的数组
      可以用arguments[0]来获取第一个参数m
      可以用arguments[1]来获取第二个参数,
    2. applay 是指调用这个方法,有两个参数

      1. this指向
      2. 数组比如[1,2,3]到时候会给fun(1,2,3)这样传递进去。
    3. [].concat.apply([], arguments) 翻译如下

      1. [].concat.apply([], [m, n])
      2. [].concat(m,n) (其实我没看懂为什么要多此一举 )
        clipboard.png
新手上路,请多包涵

1.使用[].concat.apply([],arguments);更具灵活性,调用combine函数时可以传递多个参数,包括可以传入非数组参数。
2.(...new Set(arr))当然也可以,方法不同而已,不存在为什么
3.你似乎不太懂arguments,建议看看相关文档,简单来说就是里面包含了传递给函数的实参,是一个类数组对象。

也没什么。
这里主要用了Set这个东西,集合的特点就是没有重复的元素;
然后使用Array.from来处理类数组;
而[].concat.apply([], arguments)就是使用了apply方法处理function combine() {}中传入的参数,
而concat,就是用来将两个数组拼接成一个数组,处理传入的参数可能是一个数组的情况。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏