美文网首页数据处理
数据处理之扁平化

数据处理之扁平化

作者: wudimingwo | 来源:发表于2019-01-06 22:42 被阅读0次
                var arr = [1,2,[[[['p',123,[[{},[null]]]]]]],5,[1,[6,[0,[[[null]]]]]],6,3];
                
                function isArray (arr) {
                    return Object.prototype.toString.call(arr) == "[object Array]"
                }
                
                function flatten (arr) {
                    var arr = arr || [],
                        len = arr.length,
                        resArr = [];
                    for(var i = 0; i < len; i++) {
                        if (isArray(arr[i])) {
                            resArr = resArr.concat(flatten(arr[i]))
                        } else{
                            resArr.push(arr[i])
                        }
                    }
                    return resArr 
                }
    

    数组原型上定义

                
                Array.prototype.flatten = function () {
                    var resArr = [];
                    this.forEach(function (item) {
                        Object.prototype.toString.call(item) == "[object Array]" ? resArr = resArr.concat(item.flatten()) : resArr.push(item);
                    })
                    
                    return resArr;
                }
    

    用reduce

                Array.prototype.flatten2 = function () {
                    return this.reduce(function (prev,next) {
                        return Object.prototype.toString.call(next) == "[object Array]" ? prev.concat(next.flatten2()) : prev.concat([next])
                    },[])
                }
                
                
                function flatten2 (arr) {
                    var arr = arr || [];
                    return arr.reduce(function (prev,next) {
                        return Object.prototype.toString.call(next) == "[object Array]" ? prev.concat(flatten2(next)) : prev.concat([next])
                    },[])
                }
    
    上面要注意, 不能用prev.push(next) 代替 prev.concat([next])
    原因是 prev.push(next) 语句执行后的返回值是 next 将会赋值给prev
    

    es6简化

                const flatten3 = (arr=[]) => arr.reduce((prev,next) => Object.prototype.toString.call(next) == "[object Array]" ? prev.concat(flatten3(next)) : prev.concat([next]),[])
    

    相关文章

      网友评论

        本文标题:数据处理之扁平化

        本文链接:https://www.haomeiwen.com/subject/phuerqtx.html