面试常见题-数组去重

在伯乐在线上看到的一篇文章,作者 韩池子

我以前再看面试题的时候看到这样的题目,说实话那是真不知道怎么做,现在是知道的,但是这个作者的思路的解决方法比较多样话,有一些我没见过的函数,所以我记一下:

function unique(a) {
  var res = [];
  for (var i = 0, len = a.length; i < len; i++) {
    var item = a[i];
    (res.indexOf(item) === -1) && res.push(item);
  }

  return res;
}

var a = [1, 1, '1', '2', 1];
var ans = unique(a);
console.log(ans); // => [1, "1", "2"]

很好理解,新建一个空数组res,在原数组a的每一元素上做一个循环判断,判断 res 中是否存在 a[i],如果没有,就将a[i]加入到res中去,保证了res中的元素唯一性

(res.indexOf(item) === -1) && res.push(item);

indexOf 方法是找出参数在对象上第一次出现的位置,没有出现,表示为-1,a && b连接两个表达式,如果前一个表达式是对的,就可以执行后面的表达式。 a || b 正好相反。就像是if(a){b}和if(!a){b}的简写写法。

function unique(a) {

  var res = a.filter(function(item, index, array) {
    return array.indexOf(item) === index;
  });

  return res;
}


var a = [1, 1, '1', '2', 1];
var ans = unique(a);
console.log(ans); // => [1, "1", "2"]

用到了filter函数,

a.filter(function(){item,index,array}{})

是在a数组中做一个元素循环,item是当前执行的元素的值,index是当前执行元素在原数组中的位置,array是原数组本身。函数需要有返回值,返回true为保留,false为删除。
用indexOf判断当前执行元素的值有没有在之前出现过,如果出现过的话,array.indexOf(item) 是不会等于当前的 index 的。

function unique(a) {
  return a.concat().sort().filter(function(item, pos, ary) {
    return !pos || item !== ary[pos - 1];
  });
}


var a = [1, 1, 3, 2, 1, 2, 4];
var ans = unique(a);
console.log(ans); // => [1, 2, 3, 4]

这个方法比较巧妙,它首先排列了原来的数组,再做一个filter(),它比较的是后一个元素和它之前的元素,所以不用比较第一个元素,因为第一个元素没有之前的元素。第一个元素的index是0,!0就是true,所以在filter中直接保留。在第一个元素之后的元素都要与前一个元素比较,不全等于才是true,所以”1”和1是不同的元素。

然而原作者并没注意到这点,用的是!=符号。