首页 > 网站 > WEB开发 > 正文

Javascript Array Distinct (array.reduce实现)

2024-04-27 14:20:39
字体:
来源:转载
供稿:网友

javascript Array Distinct (array.reduce实现)

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.


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表