在我们面试的过程中, 数组去重, 应该算翻牌率极高的题了, 整个测试下来, 涉及的知识点很广且有趣.
结合网上和自己的尝试, 总结起来, 有将近十种方法. 当然, 你如果还有更棒的想法, 欢迎留言开脑洞, 大家一起学习!
- var arr =['大唐',1,3,2,5,9,"1",5,4,7,0,10,6,8,"大唐","盛世","6",null,undefined,false,true,"false"];
- 1,indexOf
利用 数组如果不存在该项, indexOf = -1
- function demo1(ary){
- var i = 0,
- res = [];
- for (; i <ary.length; i++) {
- res.indexOf(ary[i]) === -1 && res.push(ary[i]);
- }
- console.log(res.sort((a,b)=>a-b));
- }
- demo1(arr);
结果:["大唐", 0, false, "false", null, "盛世", "1", true, 1, 2, 3, 4, 5, 6, "6", 7, 8, 9, 10, undefined]
2, 数组索引
数组每一项只有唯一的索引值.
这个方法有个缺点, 就是结果会把所有值, 转换成字符串类型
- function demo2(ary){
- var i,j,
- cur = [],
- res = [];
- for (i in ary) {
- cur[ary[i]] = 0
- }
- for (j in cur) {
- res.push(j)
- }
- console.log(res.sort((a,b)=>a-b));
- }
- demo2(arr);
结果: ["0", "true", "2", "3", "4", "5", "6", "7", "1", "9", "10", "大唐", "盛世", "null", "undefined", "false", "8"]
3, 对象属性
对象内属性名只能存在唯一的一个, 同样属性名, 后面会覆盖前面的属性值
如: var obj = {a:1,b:2,a:3}; console.log(obj.a); // 结果: 3
缺点同例 2, 会转换成字符串类型
- function demo3(ary){
- var i,j,
- cur = {},
- res = [];
- for (i in ary) {
- cur[arr[i]] = 0
- }
- for(j in cur){
- res.push(j)
- }
- console.log(res.sort((a,b)=>a-b));
- }
- demo3(arr);
结果: ["0", "true", "2", "3", "4", "5", "6", "7", "1", "9", "10", "大唐", "盛世", "null", "undefined", "false", "8"]
4,for 循环
利用两个 for 遍历出的值, 进行对比, 删除重复项
这一句很关键: len = ary.length; 因为 数组的长度在不断变化中.
- function demo4(ary){
- var j,
- i = 0,
- res = ary,
- len = res.length;
- for (; i <len; i++) {
- for ( j = i + 1; j < len; j++) {
- res[i] === res[j] && res.splice(j,1);
- }
- }
- console.log(res.sort((a,b)=>a-b));
- }
- demo4(arr);
结果:["0", "true", "2", "3", "4", "5", "6", "7", "1", "9", "10", "大唐", "盛世", "null", "undefined", "false", "8"]
5,reduce
通过排序, 然后 当前项 对比 上一项, 如果不同则添加到数组
- function demo5(ary){
- var res = [];
- res = ary.sort((a,b)=>a-b).reduce(function(init, current){
- if(init.length ==0 || init[init.length-1] !== current) {
- init.push(current);
- return init;
- }
- },[]);
- console.log(res.sort((a,b)=>a-b));
- }
- demo5(arr);
结果: ["大唐", 0, false, "false", null, "盛世", "1", true, 1, 2, 3, 4, 5, 6, "6", 7, 8, 9, 10, undefined]
未完待续...
来源: http://www.qdfuns.com/article/25669/c95136f35f9443a994befa6de37513bf.html