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

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

很多新手对于如何展平JavaScript数据不是很清楚。为了帮助大家解决这个问题,下面小编就详细讲解一下。需要的人可以从中学习,希望你能有所收获。

00-1010数组的扁平化就是把一个有多层的数组数组(嵌套可以是任意层数)转换成只有一层的数组。

例如,假设有一个名为扁平化的函数可以扁平化数组,效果如下:

vararr=[1,[2,[3,4]]];

console.log(扁平化(arr))//[1,2,3,4]

循环数组递归循环数组递归

想法:Loop数组,如果数据中有数组,递归调用flatten flat函数(用于loop flat),用concat连接,最后返回结果;

函数扁平化(arr){ 0

var result=[];

for(vari=0,len=arr.length伊琳;I){ 0

if(array . isarray(arr[I]){

result=result.concat(扁平化(arr[I]);

}else{

result . push(arr[I]);

}

}

返回结果;

}

Flat (arr)//[1,2,3,4]

什么是扁平化

我们首先能想到的是循环数组元素。如果它仍然是一个数组,请递归调用此方法:

vararr=[1,[2,[3,4]]];

函数扁平化(arr){ 0

var result=[];

for(vari=0,len=arr.length伊琳;I){ 0

if(array . isarray(arr[I]){

result=result.concat(扁平化(arr[i])

}

else{

结果.推送(arr[i])

nbsp;          }
        }
        return result;
    }
 
 
console.log(flatten(arr))

tostring

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

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

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

// 方法2
var 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 来简化代码:

// 方法3
var 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;
    })
}

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

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/133534.html

(0)

相关推荐

  • mysql如何修改字段的值

    技术mysql如何修改字段的值本篇内容主要讲解“mysql如何修改字段的值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql如何修改字段的值”吧!

    攻略 2021年12月2日
  • cpu为什么可以直接访问内存(cpu是如何访问内存的)

    技术CPU是如何访问内存的这期内容当中小编将会给大家带来有关CPU是如何访问内存的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。内存管理可以说是一个比较难学的模块,之所以比较难学。一是

    攻略 2021年12月21日
  • .NET Framework SQL Server 数据怎样提供程序连接池

    技术.NET Framework SQL Server 数据怎样提供程序连接池.NET Framework SQL Server 数据怎样提供程序连接池,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家

    攻略 2021年11月29日
  • 电脑网卡坏了怎么修复,笔记本的无线网卡坏了,怎么办

    技术电脑网卡坏了怎么修复,笔记本的无线网卡坏了,怎么办如果笔记本的无线网络无法连题和硬件问题两种情况电脑网卡坏了怎么修复: 第一、系统问题 无线网络无法连接的原因有:
    1、网卡驱动不正常;
    2、不小心关闭了系统的无线

    生活 2021年10月30日
  • python单元测试怎样开展(pytest如何实现自动化测试)

    技术Pyhon中如何实现单元测试这篇文章将为大家详细讲解有关Pyhon中如何实现单元测试,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。文件calculator.py#计算器类
    clas

    攻略 2021年12月17日
  • ios sdk开发需要掌握什么(ios你在项目开发中遇到的难点)

    技术IOS开发之Target-Action模式有什么用小编给大家分享一下IOS开发之Target-Action模式有什么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 该模式主要是为了减少模块之

    攻略 2021年12月24日