js数组嵌套和数组去重的问题

去除嵌套的思路:

用递归、reduce()、concat()来实现。

递归解决多层嵌套,reduce()解决每层数组的迭代拼接,concat()来拼接数组即拆除一层嵌套。

let sum = [0, 1, 2, 3].reduce(function(acc, val) {                //数组_实现flatten()函数,拆嵌套
  return acc + val;
}, 0);
console.log(sum);
// 6
let list1 = [[0, 1], [2, 3], [4, 5]];
let list2 = [0, [1, [2, [3, [4, [5, [6]]]]]]];
const flatten = (arr) => {
    return arr.reduce(
        (acc, val) => {
            return acc.concat(Array.isArray(val) ? flatten(val) : val)
        }, []
    );
};
c(flatten(list1));
// [0, 1, 2, 3, 4, 5]
c(flatten(list2));
// [ 0, 1, 2, 3, 4, 5, 6 ]


数组去重的思路:

1.创建一个新的数组存放结果

2.创建一个空对象

3.for循环时,每次取出一个元素与对象进行对比,如果这个元素不重复,则把它存放到结果数组中,同时把这个元素的内容作为对象的一个属性,并赋值为1,存入到第2步建立的对象中。

说明:至于如何对比,就是每次从原数组中取出一个元素,然后到对象中去访问这个属性,如果能访问到值,则说明重复。

代码如下:

Array.prototype.unique3 = function(){
var res = [];
var json = {};
for(var i = 0; i < this.length; i++){
if(!json[this[i]]){
res.push(this[i]);
json[this[i]] = 1;
}
}
return res;
}
var arr = [112,112,34,'你好',112,112,34,'你好','str','str1'];
alert(arr.unique3());


更简短的数组去重代码

利用filter()和indexOf()方法实现数组去重:

var arr = [1, 3, 2, 5, 2, 1, 4, 2, 1];
arr = arr.filter(function(item,index,array){
    return array.indexOf(item) === index;
  });
c(arr);

数组去除嵌套再去重:

function unite(arr1, arr2, arr3) {                        //数组拆嵌套再去重
    for(var i=1;i {
        return arr.reduce(
            function(acc,val) {
            return acc.concat(Array.isArray(val) ? flatten(val) : val);
        },[]);
    };
    arr1 = flatten(arr1);
    // var obj = {};
    // var array = [];
    function unique(array1){
    return array1 = array1.filter(function(item,index,array){
    return array1.indexOf(item) === index;
  });
    }
    arr1 = unique(arr1);
    return arr1;
}
c(unite([1, 3, 2], [5, 2, 1, 4], [2, 1]));



你可能感兴趣的:(js)