• 数组
    • 复制
    • 去重
      • 无兼容问题方式
      • ES5 方式
      • ES6 方式

    数组

    复制

    数组的复制可以通过 [].slice()[].concat() 来实现。

    去重

    这里所提供的示例只考虑数组元素是原始类型,其他情况需要根据场景改造代码。

    无兼容问题方式

    双重遍历这种方式是兼容性最好的,可以完全无视代码运行环境,但性能可能是最差的。

    1. function unique( arr ) {
    2. var result = [];
    3. var i, m, j, n;
    4. for ( i = 0, m = arr.length; i < m; i++ ) {
    5. for ( j = 0, n = result.length; j < n; j++ ) {
    6. if ( result[j] === arr[i] ) {
    7. break;
    8. }
    9. }
    10. if ( j === n ) {
    11. result.push(arr[i]);
    12. }
    13. }
    14. return result;
    15. }

    用一个对象来记录已经存在的数组元素性能会好一丢丢……

    1. function unique( arr ) {
    2. var result = [];
    3. var record = {};
    4. var k, v;
    5. for ( var i = 0, m = arr.length; i < m; i++ ) {
    6. v = arr[i];
    7. k = typeof v + v;
    8. if ( record.hasOwnProperty(k) ) {
    9. continue;
    10. }
    11. record[k] = true;
    12. result.push(v);
    13. }
    14. return result;
    15. }

    ES5 方式

    1. function unique( arr ) {
    2. return arr.filter(function( el, i, src ) {
    3. return src.indexOf(el) === i;
    4. });
    5. }

    ES6 方式

    有一种叫「集合」的数据结构的特点就是没有重复值,并且 ES6 中提供了 Set() 构造函数创建这种数据结构,因此能够用它来进行数组去重。

    由于 Set() 的实例对象是个可迭代对象,可以用同样是 ES6 新增的将一个类数组或可迭代对象转化为数组的方法 Array.from() 来转换。

    1. function unique( arr ) {
    2. return Array.from(new Set(arr));
    3. }

    用赋值与扩展运算符的方式可以更加简化:

    1. const unique = arr => [...new Set(arr)];