首页 > 其他分享 > 笔记 | 类数组与数组扁平化

笔记 | 类数组与数组扁平化

时间:2023-08-08 10:13:16浏览次数:31  
标签:function arr console 扁平化 笔记 arguments 数组 log

一、类数组 Array-like

在日常中能接触到的类数组有这么几个:

  • 参数对象 arguments;

  • 通过 querySelector 获取的 NodeList; NodeList 对象是节点集合,NodeList 可以使用 for...of 来迭代,在一些情况下,NodeList 是一个实时合集;

  • 通过函数:

    • getElementsByTagName
    • getElementsByClassName
    • getElementsByName

    获得的 HTMLCollection;HTMLCollection 是一个 HTML DOM 对象的一个接口,这个接口包含了获取的 DOM 元素集合,返回的是一个类数组对象(Array-like object)。

1. 参数对象 arguments

  • 先看一下 arguments 的各种信息

// arguments
function foo() {
    console.log(arguments) // [Arguments] { '0': 'iNSlog', '1': 123, '2': true }
    console.log(typeof arguments) // object
    console.log(Object.prototype.toString.call(arguments)) // [object Arguments]
    console.log(arguments.callee) // [Function: foo]
}
foo('iNSlog', 123, true)
  • 遍历参数操作

// 遍历参数操作
function add() {
    let sum = 0
    let len = arguments.length
    for (let i = 0; i < len; i++) {
        sum += arguments[i]
    }
    return sum
}
console.log(add()) // 0
console.log(add(1)) // 1
console.log(add(1, 2)) // 3
console.log(add(1, 2, 3, 4)) // 10
  • 自定义连接字符串函数

// 自定义连接字符串函数
function myConcat(s) {
    let args = Array.prototype.slice.call(arguments, 1)
    return args.join(s)
}
let string = myConcat(',', 'a', 'b', 'c')
console.log(string) // a,b,c
string = myConcat(';', 'a', 'b', 'c')
console.log(string) // a;b;c
string = myConcat('.', '1', '2', '3', '4', '5')
console.log(string) // 1.2.3.4.5
  • 传递参数使用

// 传递参数使用
function foo() {
    fooPrint.call(this, ...arguments)
    fooPrint.apply(this, arguments)
}
function fooPrint(a, b, c) {
    console.log(a, b, c)
}
foo(1, 2, 3) // 1 2 3

2. 类数组借用数组方法

先定义一个类数组:

const arrayLike = {
    0: 'a',
    1: 'b',
    2: 'c',
    3: 'd',
    length: 4
}
arrayLike.map((item)=>{ // arrayLike.map is not a function
    console.blog(item)
})
  • 借用数组的一些方法,以及将类数组转化为数组

// 借用数组的 map 方法
Array.prototype.map.call(arrayLike, (item) => {
    console.log(item) // a b c d
})

// 借用数组的 push 方法
Array.prototype.push.call(arrayLike, 'e', 'f')
Array.prototype.map.call(arrayLike, (item) => {
    console.log(item) // a b c d e f
})

// 借用数组的 reverse 方法
let test = []
test.reverse.call(arrayLike)
test.map.call(arrayLike, (item) => {
    console.log(item) // f e d c b a
})

// 快速求和
function sumAll() {
    let args = [].slice.call(arguments)
    return args.reduce((p, v) => p + v)
}
console.log(sumAll(1, 2, 3, 4, 5, 6, 7, 8, 9)) // 45

// ES6 类数组转换成数组的方法 Array.from
const arrLikeToArray = Array.from(arrayLike) // const arrLikeToArray: string[]
console.log(arrLikeToArray.reverse()) // [ 'a', 'b', 'c', 'd', 'e', 'f' ]

3. 类数组总结

自带方法 length 属性 callee 属性
数组 有多个 ×
类数组 ×

二、数组的扁平化

数组的扁平化:将一个嵌套多层的数组转化为只有一层的数组。例如:

[1, [2, [3, [4, 5],6]]] -> [ 1, 2, 3, 4, 5, 6 ]

0. 先定义一个数组

const array = [1, [2, [3, [4, 5], 6]]]

1. 使用递归

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

2. 利用 reduce 方法迭代

function myReduce(arr) {
    return arr.reduce(function (p, v) {
        return p.concat(Array.isArray(v) ? myReduce(v) : v)
    }, [])
}
console.log(myReduce(array)) // [ 1, 2, 3, 4, 5, 6 ]

3. 使用扩展运算符 ...

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

4. 使用 toString 和 split 方法,共同处理

function flatten(arr) {
    return arr.toString().split(',')
}
console.log(flatten(array)) // [ '1', '2', '3', '4', '5', '6' ] 变成字符数组了

5. 调用 ES6 中的 flat 方法

function flatten(arr) {
    return arr.flat(Infinity)
}
console.log(flatten(array)) // [ 1, 2, 3, 4, 5, 6 ]

6. 使用正则表达式过滤,然后调用 JSON 的方法共同处理

function flatten(arr){
    let str = JSON.stringify(arr)
    str = str.replace(/(\[|\])/g, '') // 过滤掉字符串中的 方括号[]
    str = '[' + str + ']'
    return JSON.parse(str)
}
console.log(flatten(array)) // [ 1, 2, 3, 4, 5, 6 ]

7. 数组扁平化总结

方法/问题 实现难度 编码思路
递归实现 简单 递归实现,返回新数组
reduce 实现 普通 reduce 进行累加操作
扩展运算符实现 普通 筛选出数组项进行连接
toStringsplit 简单 转成字符串再转数组
flat 方法 简单 特定功能方法直接操作
正则和 JSON 方法 普通 JSON 方法转成字符串转回过程中正则处理






标签:function,arr,console,扁平化,笔记,arguments,数组,log
From: https://www.cnblogs.com/inslog/p/17613413.html

相关文章

  • JavaScript 基础(1) - 笔记
    1JavaScript基础1.1JavaScript是什么1.JavaScript(是什么?)是一种运行在客户端(浏览器)的编程语言,实现人机交互效果。2.作用(做什么?)网页特效(监听用户的一些行为让网页做出对应的反馈)表单验证(针对表单数据的合法性进行判断)数据交互(获取后台的数据,渲染到前端)服务端编程(node.js......
  • 扫描线学习笔记
    0.写在前面扫描线好闪,拜谢扫描线1.问题的引入在一个二维的坐标系上,给出多个矩形,求他们的面积并2.问题的分析假设我们有这么一张图你要求这三个矩形的面积并,可以考虑容斥原理,但这样会TLE但总之,他最终的结果是围成了一个多边形那你不妨考虑,重新分割这个最终的图形那......
  • JS实现根据数组对象的某一属性排序
    一、冒泡排序(先了解冒泡排序机制)以从小到大排序为例,冒泡排序的原理就是通过两层循环把数组中两两相邻的元素进行比较,是的大的元素放到后边,元素交换位置,从而一步步的交换元素的位置,使得最大的元素放到数组的末尾,这样内部的循环就进行了一轮,再根据外部的循环依次再把次大一点的元素......
  • tensorflow猫狗大战笔记
    第一步:数据集的加工importcv2importos#使用os.walk()函数遍历指定文件夹train及其所有子文件夹。dir='train'#读取图片路径的设定需要在程序文件里建立train文件夹将需要更改尺寸的图片放入forroot,dirs,filesinos.walk(dir):#forroot,dirs,filesinos.walk......
  • Vue中Router笔记学习整理
    1:摘要:  Vue中的Router是Vue.js框架中的一个核心插件,用于实现单页应用(SPA)的前端路由管理。它允许你在应用中定义不同的URL路径与对应的组件之间的映射,以便在不刷新整个页面的情况下,实现页面间的切换和数据加载。主要功能包括以下几个方面:声明式路由:你可以通过定义路由......
  • k8s 学习笔记之数据存储——高级存储
    高级存储前面已经学习了使用NFS提供存储,此时就要求用户会搭建NFS系统,并且会在yaml配置nfs。由于kubernetes支持的存储系统有很多,要求客户全都掌握,显然不现实。为了能够屏蔽底层存储实现的细节,方便用户使用,kubernetes引入PV和PVC两种资源对象。PV(PersistentVolume......
  • 【刷题笔记】8. String to Integer (atoi)
    题目Implementthe myAtoi(strings) function,whichconvertsastringtoa32-bitsignedinteger(similartoC/C++'s atoi function).Thealgorithmfor myAtoi(strings) isasfollows:Readinandignoreanyleadingwhitespace.Checkifthenextcharact......
  • 『学习笔记』第二类斯特林数(部分)
    第二类斯特林数定义定义\(\begin{Bmatrix}n\\m\end{Bmatrix}\)表示\(n\)个互不相同的元素放入\(m\)个没有区分的集合并使这\(m\)个集合非空的方案数。其中\(\begin{Bmatrix}n\\m\end{Bmatrix}\)可读作“\(n\)子集\(k\)”。递推式\[\begin{Bmatrix}n......
  • 《Java编程思想第四版》学习笔记06
    为什么要把一个方法声明成final呢?正如上一章指出的那样,它能防止其他人覆盖那个方法。但也许更重要的一点是,它可有效地“关闭”动态绑定,或者告诉编译器不需要进行动态绑定。这样一来,编译器就可为final方法调用生成效率更高的代码。               ......
  • Windows c++检测笔记本是否处于睡眠状态
    最近遇到一个问题,程序需要检测电脑是否处于睡眠状态。一开始使用的方式是在WindowProc里监听WM_POWERBROADCAST消息,对PBT_APMSUSPEND``PBT_APMRESUMEAUTOMATIC消息做处理。但是实际测试中发现,这种方法在台式机中运行良好,但是放到笔记本电脑里就不行,系统休眠时监听不到WM_POWERBRO......