千家信息网

如何进行JavaScript数据扁平化分析

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,如何进行JavaScript数据扁平化分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。什么是扁平化数组的扁平化,就是将
千家信息网最后更新 2026年11月01日如何进行JavaScript数据扁平化分析

如何进行JavaScript数据扁平化分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

什么是扁平化

数组的扁平化,就是将一个嵌套多层的数组 array (嵌套可以是任何层数)转换为只有一层的数组。

举个例子,假设有个名为 flatten 的函数可以做到数组扁平化,效果就会如下:

var arr = [1, [2, [3, 4]]];console.log(flatten(arr)) // [1, 2, 3, 4]循环数组+递归

循环数组+递归

实现思路:循环数组,如果数据中还有数组的话,递归调用flatten扁平函数(利用for循环扁平),用concat连接,最终返回result;

function flatten(arr){     var result = [];     for(var i = 0, len = arr.length; i < len; i++){         if(Array.isArray(arr[i])){             result = result.concat(flatten(arr[i]));         }else{             result.push(arr[i]);         }     }     return result; } flatten(arr)   // [1,2,3,4]

递归

我们最一开始能想到的莫过于循环数组元素,如果还是一个数组,就递归调用该方法:

   var arr = [1, [2, [3, 4]]];         function flatten(arr) {        var result = [];        for (var i = 0, len = arr.length; i < len; i++) {            if (Array.isArray(arr[i])) {                result = result.concat(flatten(arr[i]))            }            else {                result.push(arr[i])            }        }        return result;    }  console.log(flatten(arr))

tostring

如果数组的元素都是数字,那么我们可以考虑使用 toString 方法,因为:

[1, [2, [3, 4]]].toString() // "1,2,3,4"

调用 toString 方法,返回了一个逗号分隔的扁平的字符串,这时候我们再 split,然后转成数字不就可以实现扁平化了

// 方法2var arr = [1, [2, [3, 4]]]; function flatten(arr) {    return arr.toString().split(',').map(function(item){        return +item    })} console.log(flatten(arr))

然而这种方法使用的场景却非常有限,如果数组是 [1, '1', 2, '2'] 的话,这种方法就会产生错误的结果。

reduce

既然是对数组进行处理,最终返回一个值,我们就可以考虑使用 reduce 来简化代码:

// 方法3var arr = [1, [2, [3, 4]]]; function flatten(arr) {    return arr.reduce(function(prev, next){        return prev.concat(Array.isArray(next) ? flatten(next) : next)    }, [])} console.log(flatten(arr))

ES6 增加了扩展运算符,用于取出参数对象的所有可遍历属性,拷贝到当前对象之中:

var arr = [1, [2, [3, 4]]];
console.log([].concat(…arr)); // [1, 2, [3, 4]]

我们用这种方法只可以扁平一层,但是顺着这个方法一直思考,我们可以写出这样的方法:

var arr = [1, [2, [3, 4]]];     function flatten(arr) {             while (arr.some(item => Array.isArray(item))) {            arr = [].concat(...arr);        }             return arr;    }         console.log(flatten(arr))

undercore

那么如何写一个抽象的扁平函数,来方便我们的开发呢,所有又到了我们抄袭 underscore 的时候了~

在这里直接给出源码和注释,但是要注意,这里的 flatten 函数并不是最终的 _.flatten,为了方便多个 API 进行调用,这里对扁平进行了更多的配置。

       /**         * 数组扁平化         * @param  {Array} input   要处理的数组         * @param  {boolean} shallow 是否只扁平一层         * @param  {boolean} strict  是否严格处理元素,下面有解释         * @param  {Array} output  这是为了方便递归而传递的参数         */
   function flatten(input, shallow, strict, output) {    // 递归使用的时候会用到output    output = output || [];    var idx = output.length;    for (var i = 0, len = input.length; i < len; i++) {        var value = input[i];        // 如果是数组,就进行处理        if (Array.isArray(value)) {            // 如果是只扁平一层,遍历该数组,依此填入 output            if (shallow) {                var j = 0, len = value.length;                while (j < len) output[idx++] = value[j++];            }            // 如果是全部扁平就递归,传入已经处理的 output,递归中接着处理 output            else {                flatten(value, shallow, strict, output);                idx = output.length;            }        }        // 不是数组,根据 strict 的值判断是跳过不处理还是放入 output        else if (!strict){            output[idx++] = value;        }    }    return output;}

解释下 strict,在代码里我们可以看出,当遍历数组元素时,如果元素不是数组,就会对 strict 取反的结果进行判断,如果设置 strict 为 true,就会跳过不进行任何处理,这意味着可以过滤非数组的元素,举个例子:

var arr = [1, 2, [3, 4]];
console.log(flatten(arr, true, true)); // [3, 4]

那么设置 strict 到底有什么用呢?不急,我们先看下 shallow 和 strct 各种值对应的结果:

shallow true + strict false :正常扁平一层

shallow false + strict false :正常扁平所有层

shallow true + strict true :去掉非数组元素

shallow false + strict true : 返回一个[]

我们看看 underscore 中哪些方法调用了 flatten 这个基本函数:

_.flatten

首先就是 _.flatten:

_.flatten = function(array, shallow) {    return flatten(array, shallow, false);};

在正常的扁平中,我们并不需要去掉非数组元素。

_.union

该函数传入多个数组,然后返回传入的数组的并集,

举个例子:

_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]);
=> [1, 2, 3, 101, 10]

如果传入的参数并不是数组,就会将该参数跳过:

_.union([1, 2, 3], [101, 2, 1, 10], 4, 5);
=> [1, 2, 3, 101, 10]

为了实现这个效果,我们可以将传入的所有数组扁平化,然后去重,因为只能传入数组,这时候我们直接设置 strict 为 true,就可以跳过传入的非数组的元素。

function unique(array) {   return Array.from(new Set(array));} _.union = function() {    return unique(flatten(arguments, true, true));}

_.difference

是不是感觉折腾 strict 有点用处了,我们再看一个 _.difference:

语法为:

_.difference(array, *others)

效果是取出来自 array 数组,并且不存在于多个 other 数组的元素。跟 _.union 一样,都会排除掉不是数组的元素。

举个例子:

_.difference([1, 2, 3, 4, 5], [5, 2, 10], [4], 3);
=> [1, 3]

实现方法也很简单,扁平 others 的数组,筛选出 array 中不在扁平化数组中的值:

function difference(array, ...rest) {     rest = flatten(rest, true, true);     return array.filter(function(item){        return rest.indexOf(item) === -1;    })}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

数组 扁平 方法 元素 递归 处理 函数 循环 例子 参数 多个 效果 结果 数据 代码 对象 就是 数字 时候 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海睿民互联网科技有限公司 互联网是第几次科技革命的成果 美国互联网科技巨头监管 上海挚品互联网科技 杭州互联网科技公司 互联网科技公司官网 天津摩尔互联网科技 齐家互联网科技有限公司 互联网科技美容 成都狮子座互联网科技 盛创互联网科技有限公司 团飞科技与伯堂互联网服务平台 南山科技园互联网公司有哪些 厦门比较好的科技互联网公司 科技互联网大厂 昭通互联网科技选哪家 消费医药和互联网科技 开一家科技互联网公司需要多少钱 上海科技产业互联网平台 互联网界的黑科技 西安互联网科技 互联网 的科技创新 重庆科技学院互联网 深圳市运趣互联网科技有限公司 中国航天科技大学国际工业互联网 辽宁互联网新科技 互联网科技扶贫时间 黑科技 体验场景 互联网大会 全球科技与互联网公司市值变化 中国互联网公司的科技投入
0