在伯乐在线上看到的一篇文章,作者 韩池子
我以前再看面试题的时候看到这样的题目,说实话那是真不知道怎么做,现在是知道的,但是这个作者的思路的解决方法比较多样话,有一些我没见过的函数,所以我记一下:
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是不同的元素。
然而原作者并没注意到这点,用的是!=符号。