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

<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 array;
}

(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。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值