JavaScript 数组常见操作技巧 (二)

目录
  • 一、出数组中的重复元素或非重复元素
  • 二、数组扁平化 / 数组降维
    • 二维数组:双重循环
    • 二维数组:循环 + concat
    • 二维数组:reduce + concat
    • 二维数组:展开 / apply + concat
    • 多维数组:toString + split
    • 多维数组:forEach + 递归
    • 多维数组:reduce + 递归
    • 多维数组:while + some
    • 不确定维数的数组: flat

前言:

数组是 JavaScript 中常见数据类型之一,关于它的一些操作方法,我在这里做一下简单记录和总结。

今天主要介绍:

  • 如何找出数组中的重复/非重复元素
  • 数组扁平化方法

一、出数组中的重复元素或非重复元素

双重循环 + slice,找出重复的元素。虽然只要求找出重复元素,但应该注意要顺便去重,否则外循环还是会对重复元素进行一遍检查;用 flag 记录重复次数,只在第一次重复的时候将元素放入新数组

function search(arr){
    let res = []
    let flag = 0
    for(let i = 0;i < arr.length;i++){
        for(let j = i+1;j<arr.length;j++){
            if(arr[i] === arr[j]){
                flag++
                if(flag == 1) res.push(arr[i])
                arr.splice(j,1)
            }    
        }
        flag = 0
    }
    return res
}

map + filter,记录每个元素出现的次数。有了重复次数,就可以筛选出重复元素、重复次数最多元素或者非重复元素:

function search(arr){
    const map = new Map()
    for(item of arr){
        if(!map.has(item)){
            map.set(item,1)
        } else {
            map.set(item,map.get(item)+1)
        }
    }
    // 找出重复元素,即出现次数大于1
    return [...map.entries()].filter(item => item[1] > 1).map(item => item[0])
    // 找出非重复元素,即出现次数等于1
    return [...map.entries()].filter(item => item[1] == 1).map(item => item[0])
    // 找出重复次数最多的元素
    return [...map.entries()]
        .filter(item => item[1] == Math.max(...map.values()))
        .map(item => item[0])
}

二、数组扁平化 / 数组降维

二维数组,以[[],[{a:1}],[],[3,4],5] 为例,降维后得到[{a:1},3,4,5]

二维数组:双重循环

需要检查是否每个元素都是数组

function flatten(arr){
    const res = []
    for(let i = 0;i < arr.length; i++){
        if(Array.isArray(arr[i])){
            for(let j = 0;j < arr[i].length;j++){
                res.push(arr[i][j])
            }            
        } else {
            res.push(arr[i])
        }      
    }
    return res
}

二维数组:循环 + concat

concat 本身就可以给数组降维一次

function reduceDiemension(arr){
    const res = []
    for(let i = 0;i < arr.length;i++){
        res = res.concat(arr[i])
    }
    return res
}

二维数组:reduce + concat

上面的过程本身是一种归并,所以考虑使用 reduce

function flatten(arr){
    return arr.reduce((acc,cur) => acc.concat(cur),[])
}

二维数组:展开 / apply + concat

通过展开原数组或者将其作为 apply 的第二个参数,把数组转化为一个参数列表

function flatten(arr){
    // return [].concat([],arr)
    return [].concat(...arr)
}

多维数组,以下面的数组为例:

const arr = [
    1,
    [
        2,[3],
        [4,5,6],
        [7,8,9],
        10,11
    ],
    12,
    13,
    [15,16,17]
]

降维后得到 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17]

多维数组:toString + split

数组降维可以看作是把所有的括弧都去掉,而数组的 toString 方法刚好可以做这个事,之后再调用字符串的 split 把字符串转换回数组即可。但这个方法很局限,要求数组元素的数据类型都相同。

function flattern_numberArray(arr){
    return arr.toString().split(",").map(x => Number)
}

多维数组:forEach + 递归

function flatten(arr){
    const res = []
    arr.forEach(item => {
        if(Array.isArray(item)){
            flatten(item)
        } else {
            res.push(item)
        }
    })
    return res
}

多维数组:reduce + 递归

同理,上面的过程是一种归并,可以使用 reduce 完成。需要注意的是,reduce 的回调函数必须返回一个数组,所以不要再用 push

function flatten(arr){
    return arr.reduce((acc,cur) => {
        if(Array.isArray(cur)){
            return [...acc , ...flatten(cur)]    
        } else {
            return [...acc,cur]
        }
    },[])
}

多维数组:while + some

只要数组中还有数组,就使用 concat 给这个数组降维。这个方法可以不使用递归

function flatten(arr){    
    while(arr.some(item => Array.isArray(item))){
        arr = [].concat(...arr)
    }
    return arr
}

不确定维数的数组: flat

数组降维,直接用之前讲过的 flat 是最简单的。默认传参 1,表示降维一次;可以传参 Infinity,实现完全降维,最终得到一个一维数组。

到此这篇关于JavaScript 数组常见操作技巧 (二)的文章就介绍到这了,更多相关JavaScript 数组操作技巧内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaScript中数组常见操作技巧

    效果图如下所示: Tip: 右键在新标签中打开查看清晰大图 下面介绍JavaScript中的数组对象遍历.读写.排序等操作以及与数组相关的字符串处理操作 创建数组 一般使用数组字面量[]创建新数组,除非想要创建指定长度的数组 // good var arr = []; var arr = ['red', 'green', 'blue']; var arr = [ ['北京', 90], ['上海', 50], ['广州', 50] ]; // bad var arr = new Object()

  • JavaScript 数组常见操作技巧

    目录 一.创建数组 二.判断是不是数组 三.类数组和数组的转换 四.数组去重 1.利用 set 去重 2.双重循环 + splice 3.新建数组 + includes 4.reduce + includes 5.新建数组 + sort 6.新建数组 + 利用对象属性 7.利用 map 8.filter + indexOf 本文主要包括: 创建数组 判断是不是数组 类数组和数组的转换 数组去重 各位看官可根据自身需求选择食用. 一.创建数组 创建数组是基本功,其方法主要包括以下几种: const

  • JavaScript面试技巧之数组的一些不low操作

    前言 本文主要从应用来讲数组api的一些骚操作; 如一行代码扁平化n维数组.数组去重.求数组最大值.数组求和.排序.对象和数组的转化等: 上面这些应用场景你可以用一行代码实现? 1.扁平化n维数组 1.终极篇 [1,[2,3]].flat(2) //[1,2,3] [1,[2,3,[4,5]].flat(3) //[1,2,3,4,5] [1,[2,3,[4,5]]].toString() //'1,2,3,4,5' [1[2,3,[4,5[...]].flat(Infinity) //[1,2

  • JavaScript数组常用操作技巧汇总

    本文实例汇总了JavaScript数组的常用操作技巧.分享给大家供大家参考.具体如下: 前言 相信大家都用惯了jquery或者underscore等这些类库中常用的数组相关的操作,如$.isArray,_.some,_.find等等方法.这里无非是对原生js的数组操作多了一些包装. 这里主要汇总一下JavaScript数组操作的常用API.相信对大家解决程序问题很有帮助. 一.性质 JavaScript中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数.然而,这些数字索

  • JavaScript数组的定义及数字操作技巧

    一.数组的介绍 数组中的元素类型可以是数字型.字符串型.布尔型等,甚至也可以是一个数组. 二.定义数组 1.通过数组的构造函数来定义数组: var arr=new Array(); var arr=new Array(size); var arr=new Array(element1,element2,...); 2.直接定义数组: var arr=["字符串",true,13]; ps: 和Object一样,此写法不会调用Array()构造函数. 三.数组元素 1.存取数组元素:通过

  • javascript 数组操作实用技巧

    1.concat方法 [作用] 将多个数组联合起来,这个方法不会改变现存的数组,它只返回了所结合数组的一份拷贝. [语法] arrayObj.concat(array1,array2,...) [实例] var array1 = new Array("1","2"); var array2 = new Array("3","4"); var array3 = array1.concat(array2); document.wr

  • JavaScript 数组常见操作技巧 (二)

    目录 一.出数组中的重复元素或非重复元素 二.数组扁平化 / 数组降维 二维数组:双重循环 二维数组:循环 + concat 二维数组:reduce + concat 二维数组:展开 / apply + concat 多维数组:toString + split 多维数组:forEach + 递归 多维数组:reduce + 递归 多维数组:while + some 不确定维数的数组: flat 前言: 数组是 JavaScript 中常见数据类型之一,关于它的一些操作方法,我在这里做一下简单记录

  • javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】

    本文实例讲述了javascript数组常见操作方法.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>www.jb51.net 数组的方法</title> <script> var arr=[1,3,4] var arr1=["a",&quo

  • js数组常见操作及数组与字符串相互转化实例详解

    本文实例讲述了js数组常见操作及数组与字符串相互转化方法.分享给大家供大家参考,具体如下: 数组与字符串的相互转化 <script type="text/javascript"> var obj="new1abcdefg".replace(/(.)(?=[^$])/g,"$1,").split(","); //字符串转化为数组 var obj2 = "new2abcdefg".split(&qu

  • 27个JavaScript数组常见方法汇总与实例说明

    1. push() 概括:数组末位增加 参数:需要增加的数据 返回值:数组更新后的长度 let arr = [1,2,3] arr.push(1) // 返回新增后的数组长度 4 arr.push() // 不传参数默认不新增 4 arr.push(1,2,3) // 新增多条数据时,返回新增完成后的数组长度 7 2. pop() 概括:数组末位删除 参数:无 返回值:删除的数据 let arr = [3] arr.pop() // 返回已删除的数据 3 arr.pop() // 当数组数据为空

  • Python中字符串的常见操作技巧总结

    本文实例总结了Python中字符串的常见操作技巧.分享给大家供大家参考,具体如下: 反转一个字符串 >>> S = 'abcdefghijklmnop' >>> S[::-1] 'ponmlkjihgfedcba' 这种用法叫做three-limit slices 除此之外,还可以使用slice对象,例如 >>> 'spam'[slice(None, None, -1)] >>> unicode码与字符(single-characte

  • vue中的双向数据绑定原理与常见操作技巧详解

    本文实例讲述了vue中的双向数据绑定原理与常见操作技巧.分享给大家供大家参考,具体如下: 什么是双向数据绑定? vue是一个mvvm框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化.这也是算是vue的精髓之处了.值得注意的是,我们所说的数据双向绑定,一定是对于UI控件来说的,非UI控件不会涉及到数据双向绑定.单向数据绑定是使用状态管理工具的前提,如果我们使用vuex,那么数据流也是单向的,这时就会和双向数据绑定有冲突,我们可以这么解决.

  •  python中字符串的常见操作总结(二)

    目录 字符串的编码格式 什么是编码格式? 常见的编码格式 字符串格式化 什么是字符串格式化? 格式化字符串的使用场景 第一种格式化方法—% 第二种格式化方法–格式化函数format() 第三种格式化方法–f-strings(python3.6及之后的版本支持) 详解对不同数据类型的格式化 format() 不常用的格式 字符串的转义字符 python中的转义字符 将转义字符无效化 字符串的编码格式 什么是编码格式? 通俗来讲,编码格式就是编码的规则 在脚本的开头指定编码格式,来告诉操作系统根据什

随机推荐