您的位置:首页 > Web前端 > JavaScript

[从codewars学习到的JS系列3]数组filter方法与函数call方法妙用

2016-06-30 21:26 676 查看
<level2>问题:去除字符串或数组里相邻重复的项,并以数组形式输出结果。如输入[“a”,“b”,“b”,“c”,“a”,“a”],输出[“a”,“b”,“c”,“a”],字符串同理,输出数组。

solution:

(1)

var uniqueInOrder=function(iterable){
var result = [];
for (var i = 0, length = iterable.length; i < length; i++){
if (iterable.indexOf(iterable[i]) !== iterable.indexOf(iterable[i + 1])) {
result.push(iterable[i]);
}
}
return result;
}


(2)

var uniqueInOrder=function(iterable){
var array = [];
for(var i=0; i<iterable.length;i++){
if(iterable[i+1] != iterable[i]){
array.push(iterable[i]);
}
}
return arra
4000
y;
}


(3)

function uniqueInOrder(iterable) {
var result = [];
var last;
for (var i = 0; i < iterable.length; i++) {
if (iterable[i] !== last) {
result.push(last = iterable[i]);
}
}
return result;
}


(4)

var uniqueInOrder = function (iterable) {
return [].filter.call(iterable, (function (a, i) { return iterable[i - 1] !== a }));
}


说明:

前两个方法比较相似,思路都值得借鉴,第一个方法巧用indexOf(“a”)返回的始终是第一次找到”a”的位置的特性,第二个方法思路没第一个那么复杂,不过利用到了JS中数组索引超出数组长度不会报错,只是取到的值是undefined这么一个特性,也少了些判断。

第三个方法思路更好,少了多次从数组取值的操作,另外将last=iterable[i]赋值操作直接写在push方法里,传进去的参数其实就是iterable[i],同时赋值给last罢了,简的不能再简。

第四个方法最聪明,利用函数都有的call方法,将数组专属方法filter运行的作用域扩展到string上,由于array和string获取数据操作相同,都可以obj[index]形式来获取,因此在string上调用filter也不会出错。call里传入两个参数,第一个就是在其中运行函数的作用域,第二个是filter方法的参数,即一个回调函数,iterable[i - 1] !== a这里iterable数据类型是array或是string都不会出错,str[-1],arr[-1]都会返回undefined。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息