如何进行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)

相关推荐

  • javascript中prototype方法有什么用

    技术javascript中prototype方法有什么用这篇文章主要为大家展示了“javascript中prototype方法有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习

    攻略 2021年11月15日
  • 中药蜜丸的制作方法,中药密丸的制作方法谁知道呀?

    技术中药蜜丸的制作方法,中药密丸的制作方法谁知道呀?蜜丸制作方法中药蜜丸的制作方法: 1、蜂蜜用量:一般药粉与炼蜜的比例是10:3,炼蜜与水的比例为1:3。药粉的粘性的大小不同改变蜜水浓度与用蜜量。
    2、制作步骤:

    生活 2021年10月29日
  • 凤梨和菠萝对照图片,凤梨是菠萝吗

    技术凤梨和菠萝对照图片,凤梨是菠萝吗你好,凤梨不是菠萝凤梨和菠萝对照图片。二者有以下本质的不同:一、凤梨的基本情况1.凤梨的产地凤梨是一种著名的热带水果,原产自美洲的热带地区,在我国的广东、台湾、广西、海南、福建和云南等

    生活 2021年10月25日
  • bootstrap组件

    技术bootstrap组件 bootstrap组件!DOCTYPEhtml
    htmllang="en"head
    metacharset="UTF-8"
    metahttp-equiv="X-UA-Comp

    礼包 2021年12月7日
  • nodejs是一门语言吗

    技术nodejs是一门语言吗这篇文章主要讲解了“nodejs是一门语言吗”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs是一门语言吗”吧!

    攻略 2021年11月19日
  • mysql如何用rpm安装

    技术mysql如何用rpm安装这篇文章给大家分享的是有关mysql如何用rpm安装的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。RedHat 下自带的mysql rpm包为mysql-3.23

    攻略 2021年11月6日