Javascript Array Distinct (array.reduce实现)

本文介绍JavaScript中实现数组去重的方法,包括使用双重for循环检查重复元素的传统方式,以及利用对象索引提高效率的技巧,并展示了如何通过reduce方法将去重功能添加到Array原型中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

javascript 没有原生的Distinct功能 . (至少现在还没有)
但我们可以通过简单的script 自己实现 . 
Distinct就是把数组中重复出现2次或以上的值给删除掉,确保数组内每个值都是唯一的 . 
我相信大家开始的时候都会和我用同一个方法来处理。
那就是开一个新的数组(空),然后 for loop 旧的数组 ,然后复制进去新的数组里面,每次复制进去的时候先检查一篇新数组内是否有了这个值,有了就跳过,没有才加进去 。 
代码 :
  var old_array = [1, 2, 3, 3, 4, 5]; //3重复了
            var new_array = [];
            for (var i = 0; i < old_array.length; i++) {
                var value = old_array[i];
                var is_exist = false;
                for (var j = 0; j < new_array.length; j++) { 
                    if (new_array[j] === old_array[i]) { //检查
                        is_exist = true;
                        break;
                    }
                }
                if (is_exist) continue;//跳过
                new_array.push(old_array[i]); //添加
            }
            alert(new_array); //[1,2,3,4,5]

有些人可能觉得这样效率不太好,因为for loop 很多次匹配 .
有人就建议使用 object 来替代 
代码 : 
  var u = {}, a = [];
        for (var i = 0, l = this.length; i < l; ++i) {
            if (u.hasOwnProperty(this[i])) {
                continue;
            }
            a.push(this[i]);
            u[this[i]] = 1;
        }
        return a;
object 走索引,似乎可以快一些,但是这里有个小问题。
就是如果你的数组中有 object ,这样就会造成错误了。(ECMA6好像不会了)
因为object 的属性不能是 object ,只能是 string 和 number .
所以不鼓励使用这个方法,除非你确保你的数组内的值都是 string , number . 
总结 : 
方法1的文言文写法是这样的 : 
代码 :
  var old_array = [1, 2, 3, 3, 4, 5]; //3重复了
            old_array = old_array.reduce(function (new_array, old_array_value) {
                if (new_array.indexOf(old_array_value) == -1) new_array.push(old_array_value);
                return new_array; //最终返回的是 prev value 也就是recorder
            }, []);

最后把它加入 array的 prototype里面就可以啦 
代码 : 
 Array.prototype.distinct = function () {
        return this.reduce(function (new_array, old_array_value) {
            if (new_array.indexOf(old_array_value) == -1) new_array.push(old_array_value);
            return new_array; //最终返回的是 prev value 也就是recorder
        }, []);
    }
调用 :
var old_array = [1, 2, 3, 3, 4, 5]; //3重复了
var new_array = old_array.distinct();

这里顺便提一下 reduce 方法

function(prev,now,index,array) { return prev; }

当index=0时,prev就是我们第一次传入reduce方法的第2个参数 (reduce(fn, 这个值 <--))

接着循环时 now 就是 array 内的值 

每次return的值是下一次循环的 prev 值 , 所以最后我们得到的就是prev. 

 

转载于:https://www.cnblogs.com/keatkeat/p/3896549.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值