[从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; iif(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。

你可能感兴趣的:(JavaScript)