JavaScript数组常用方法解析及数组扁平化

目录
  • 前言
  • 一、常用数组操作方法
    • push末尾追加元素
    • pop删除数组末尾元素
    • sort排序
    • shift数组开头添加元素 && unshift数组开头删除元素
    • 数组合并concat
    • indexOf查找元素 && includes查找元素是否存在
    • reverse反转数组
    • 数组切割成字符串join
    • slice操作数组,替换,删除,新增
    • every校验数组所有元素
    • some 测试数组中是不是至少有1个元素通过了被提供的函数测试。返回值是布尔值
    • 深层次递归数组flat
    • map遍历数组
  • 二、总结

前言

数组作为在开发中常用的集合,除了for循环遍历以外,还有很多内置对象的方法,包括map,以及数组筛选元素filter等。

注:文章结尾处附深层次数组扁平化方法操作。

作为引用数据类型的一种,在处理数组Array的时候,我们需要考虑到深拷贝和浅拷贝的情况

可以参考以下文章:

  • javaScript深拷贝和浅拷贝的简单介绍
  • javaScript中一些常见的数据类型检查校验

一、常用数组操作方法

push末尾追加元素

/**
 * @param push 将一个或多个元素添加到数组的末尾,返回该数组的新长度
 *
 * 集合apply和call合并数组
 *
 */
let user = ["zhangsan", "lisi"];
console.log(user.push("xiaoming")); //	3
console.log(user); // ["zhangsan", "lisi", "xiaoming"]
let user1 = ["xiaowang", "xiaoming"];
let user2 = ["zhangsan", "lisi"];
console.log(Array.prototype.push.apply(user1, user2)); // 	4
console.log(user1); // ["xiaowang", "xiaoming", "zhangsan", "lisi"]

pop删除数组末尾元素

/**
 *
 * @param pop 方法从数组中删除最后一个元素,返回值是该元素。
 *
 * 如果数组是空数组,那么返回的是undefined
 *
 */
let user = ["zhangsan", "lisi"];
console.log(user.pop()); //	lisi
console.log(user); //	["zhangsan"]
let empArray = [];
console.log(empArray.pop()); //	undefined

sort排序

/**
 *
 * @param sort
 *
 * 使用原地算法对数组的元素进行排序,并返回数组。
 * 默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的
 * 由于它取决于具体实现,因此无法保证排序的时间和空间复杂性。
 *
 * arr.sort([compareFunction])
 *
 * @param compareFunction
 *
 * 用来指定按某种顺序进行排列的函数。
 * 如果省略,元素按照转换为的字符串的各个字符的Unicode位点进行排序。
 *
 * 如果没有指明 compareFunction ,那么元素会按照转换为的字符串的诸个字符的Unicode位点进行排序。
 * 例如 "Banana" 会被排列到 "cherry" 之前。
 * 当数字按由小到大排序时,9 出	* 现在 80 之前,但因为(没有指明 compareFunction),比较的数字会先被转换为字符串,所以在Unicode顺序上 "80" 要比 "9" 要靠前。
 * 如果指明了 compareFunction ,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:
 * 如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;
 * 如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。
 * 备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);
 * 如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前。
 * compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。
 *
 * firstEl
 * 第一个用于比较的元素。
 * secondEl
 * 第二个用于比较的元素
 *
 */
/**
 *
 * 基本用法
 *
 * */

const user = ["zhangsan", "lisi", "xiaoming", "xiaowang"];
user.sort();
console.log(user); // ["lisi", "xiaoming", "xiaowang", "zhangsan"]
const array1 = [1, 30, 4, 21, 100000];
array1.sort();
console.log(array1); // [1, 100000, 21, 30, 4]

/**
 *
 * 自定义排序方法
 *
 * */
var numbers = [4, 2, 5, 1, 3];
let sortFun = function (a, b) {
  return a - b;
};
numbers.sort(sortFun);
console.log(numbers); // [1, 2, 3, 4, 5]

shift数组开头添加元素 && unshift数组开头删除元素

/**
 *
 * @param shift
 * 从数组中删除第一个元素,并返回该元素的值,如果删除空数组,返回值是undefined
 *
 * @param unshift
 * 方法将一个或多个元素添加到数组的开头,并返回该数组的新长度
 *
 * */
let user = ["zhangsan", "lisi"];
console.log(user.shift()); //	zhangsan
console.log(user); //	["lisi"]
let empArray = [];
console.log(empArray.shift()); //	undefined
let user1 = ["xiaoming", "xiaowang"];
console.log(user1.unshift("xiaoming1", "xiaowang1")); //	4
console.log(user1); //	["xiaoming1", "xiaowang1", "xiaoming", "xiaowang"]

数组合并concat

/**
 *
 * @param concat
 *
 * 方法用于合并两个或多个数组。返回值是新数组,原数组不会发生更改
 *
 * 注:数组合并是浅拷贝
 *
 */
let user = ["zhangsan", "lisi"];
let user1 = [["xiaowang"], { name: "xiaoming" }];
console.log(user.concat(user1)); // ["zhangsan","lisi",["xiaowang"],{name: "xiaoming"}]
console.log(user); // ["zhangsan", "lisi"]

indexOf查找元素 && includes查找元素是否存在

/**
 *
 * @param indexOf
 *
 * 返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1,
 * 常用于判断数组是否存在某个元素
 *
 * @param includes
 *
 * 判断一个数组是否包含一个指定的值,返回值是布尔值 true 或者 false
 *
 */
let user = ["zhangsan", "lisi"];
console.log(user.indexOf("lisi")); // 1
console.log(user.indexOf("xiaoming")); // -1
let user1 = ["zhangsan", ["xiaowang"], { name: "xiaoming" }];
console.log(user1.includes("zhangsan")); // true
console.log(user1.includes(["xiaowang"])); // false
console.log(user1.includes({ name: "xiaoming" })); // false

reverse反转数组

/**
 *
 * @param reverse
 *
 * 反转数组元素,将原有数组倒叙显示,会改变元素的元素位置
 *
 */
let user = ["zhangsan", "lisi", "xiaoming"];
console.log(user.reverse()); // ["xiaoming", "lisi", "zhangsan"]
console.log(user); // ["xiaoming", "lisi", "zhangsan"]
let user1 = ["zhangsan", ["xiaowang", "lisi"], { name: "xiaoming" }];
console.log(user1.reverse()); // [{name: "xiaoming"},["xiaowang", "lisi"],"zhangsan"]

数组切割成字符串join

/**
 *
 * @param join
 *
 * 根据传入的参数字符串,对数组进行切割,返回值是使用参数拼接元素的字符串
 * 如果数组只有一个元素,则不使用分割符号
 *
 */
let user = ["zhangsan", "lisi", "xiaoming"];
console.log(user.join(" ")); // zhangsan lisi xiaoming
console.log(user.join("")); // zhangsanlisixiaoming
console.log(user.join(",")); // zhangsan,lisi,xiaoming
console.log(user.join({ a: 1 })); // zhangsan[object Object]lisi[object Object]xiaoming
console.log(user); // ["zhangsan", "lisi", "xiaoming"]

slice操作数组,替换,删除,新增

slice使用的范围较广,不同的参数可以实现对数组的删除,新增和替换等,使用的时候需要注意参数的具体使用方法

/**
 *
 * @param slice
 *
 * 返回一个新的数组对象,
 * 这一对象是一个由 begin 和 end 决定的原数组的浅拷贝(包括 begin,不包括end)。原始数组不会被改变。
 *
 * @param begin
 * 提取起始处的索引(从 0 开始),从该索引开始提取原数组元素。
 * 如果该参数为负数,则表示从原数组中的倒数第几个元素开始提取,slice(-2) 表示提取原数组中的倒数第二个元素到最后一个元素(包含最后一个元素)。
 * 如果省略 begin,则 slice 从索引 0 开始。
 * 如果 begin 超出原数组的索引范围,则会返回空数组
 *
 * @param end
 *
 * 提取终止处的索引(从 0 开始),在该索引处结束提取原数组元素。
 * slice 会提取原数组中索引从 begin 到 end 的所有元素(包含 begin,但不包含 end)。
 * slice(1,4) 会提取原数组中从第二个元素开始一直到第四个元素的所有元素 (索引为 1, 2, 3的元素)。
 * 如果该参数为负数, 则它表示在原数组中的倒数第几个元素结束抽取。
 * slice(-2,-1) 表示抽取了原数组中的倒数第二个元素到最后一个元素(不包含最后一个元素,也就是只有倒数第二个元素)。
 * 如果 end 被省略,则 slice 会一直提取到原数组末尾。如果 end 大于数组的长度,slice 也会一直提取到原数组末尾。
 *
 */
const animals = ["ant", "bison", "camel", "duck", "elephant"];
console.log(animals.slice(2)); // Array ["camel", "duck", "elephant"]
console.log(animals.slice(2, 4)); // Array ["camel", "duck"]
console.log(animals.slice(1, 5)); // Array ["bison", "camel", "duck", "elephant"]
console.log(animals.slice(-2)); // Array ["duck", "elephant"]
console.log(animals.slice(2, -1)); // Array ["camel", "duck"]
console.log(animals.slice()); // Array ["ant", "bison", "camel", "duck", "elephant"]
/**
 *
 * @param splice(start[, deleteCount[, item1[, item2[, ...]]]])
 *
 * 通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组
 *
 * 由被删除的元素组成的一个数组。如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组。
 *
 * @param start
 *
 * 指定修改的开始位置,默认从下标0开始。
 * 如果超出了数组的长度,则从数组末尾开始添加元素;
 * 如果是负值,则表示从数组末位开始的第几位(从-1计数,这意味着-n是倒数第n个元素并且等价于array.length-n);
 * 如果负数的绝对值大于数组的长度,则表示开始位置为第0位。
 *
 * @param deleteCount
 *
 * 整数,表示要移除的数组元素的个数。
 * 如果 deleteCount 大于 start 之后的元素的总数,则从 start 后面的元素都将被删除(含第 start 位)。
 * 如果 deleteCount 被省略了,
 * 或者它的值大于等于array.length - start(也就是说,如果它大于或者等于start之后的所有元素的数量),
 * 那么start之后数组的所有元素都会被删除。
 *
 * 如果 deleteCount 是 0 或者负数,则不移除元素。这种情况下,至少应添加一个新元素。
 * @param item1, item2, ...
 *
 * 要添加进数组的元素,从start 位置开始。如果不指定,则 splice() 将只删除数组元素
 *
 */
const months = ["Jan", "March", "April", "June"];
months.splice(1, 0, "Feb"); // 下表为1,插入一个元素
console.log(months); // ["Jan", "Feb", "March", "April", "June"]
months.splice(4, 1, "May"); // 替换下标为4的元素
console.log(months); // ["Jan", "Feb", "March", "April", "May"]
let del = months.splice(1, 1); // 删除
console.log(del); // ["Feb"]
console.log(months); // ["Jan", "April", "May"]

every校验数组所有元素

/**
 *
 * @param every
 * 测试一个数组内的所有元素是否都能通过某个指定函数的测试,返回值是布尔值 true or false
 * 备注:若收到一个空数组,此方法在任何情况下都会返回 true。
 *
 * arr.every(callback(element[, index[, array]])[, thisArg])
 * callback
 * 用来测试每个元素的函数,它可以接收三个参数:
 *
 * @param element 用于测试的当前值。
 * @param index可选 用于测试的当前值的索引。
 * @param array可选 调用 every 的当前数组。
 *
 * every 方法为数组中的每个元素执行一次 callback 函数,直到它找到一个会使 callback 返回 false 的元素。
 * 如果发现了一个这样的元素,every 方法将会立即返回 false。
 * 否则,callback 为每一个元素返回 true,every 就会返回 true。
 *
 * callback 只会为那些已经被赋值的索引调用。不会为那些被删除或从未被赋值的索引调用。
 * callback 在被调用时可传入三个参数:元素值,元素的索引,原数组。
 * 如果为 every 提供一个 thisArg 参数,则该参数为调用 callback 时的 this 值。
 * 如果省略该参数,则 callback 被调用时的 this 值,在非严格模式下为全局对象,在严格模式下传入 undefined。
 *
 *
 * every 不会改变原数组。
 * every 遍历的元素范围在第一次调用 callback 之前就已确定了。
 * 在调用 every 之后添加到数组中的元素不会被 callback 访问到。
 * 如果数组中存在的元素被更改,则他们传入 callback 的值是 every 访问到他们那一刻的值。
 * 那些被删除的元素或从来未被赋值的元素将不会被访问到。
 *
 * */
const isBelowThreshold = (currentValue) => currentValue < 40;
const array1 = [1, 30, 39, 29, 10, 13];
console.log(array1.every(isBelowThreshold)); // true

some 测试数组中是不是至少有1个元素通过了被提供的函数测试。返回值是布尔值

/**
 *
 * @param some 测试数组中是不是至少有1个元素通过了被提供的函数测试。返回值是布尔值
 *
 * */
const array = [1, 2, 3, 4, 5];
const even = (element) => element % 2 === 0; //确认偶数
console.log(array.some(even)); // true;

深层次递归数组flat

/**
 * @param flat	按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。
 *
 * var newArray = arr.flat([depth])
 * @depth  指定要提取嵌套数组的结构深度,默认值为 1。
 * */
let arr1 = [1, 2, [3, 4]];
console.log(arr1.flat()); // [1, 2, 3, 4]
let arr2 = [1, 2, [3, 4, [5, 6]]];
console.log(arr2.flat()); // [1, 2, 3, 4, [5, 6]]
let arr3 = [1, 2, [3, 4, [5, 6]]];
console.log(arr3.flat(2)); // [1, 2, 3, 4, 5, 6]
//使用 Infinity,可展开任意深度的嵌套数组
let arr4 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]];
console.log(arr4.flat(Infinity)); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let objArray = [{ name: "zhangsan", children: ["张三"] }];
console.log(objArray.flat(Infinity)); // [{ name: "zhangsan", children: ["张三"] }]

map遍历数组

/**
 * @param map
 *
 * 创建一个新数组,这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成
 *
 * */
const array1 = [1, 4, 9, 16];
const map1 = array1.map((x) => x * 2);
console.log(map1); // [2, 8, 18, 32]

二、总结

到此这篇关于JavaScript数组常用方法解析和深层次js数组扁平化的文章就介绍到这了,更多相关JavaScript数组内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Js数组扁平化实现方法代码总汇

    题目: 请写出一个数组拍平函数.效果如下: var arr=['a', ['b', 'c'], 2, ['d', 'e', 'f'], 'g', 3, 4]; flat(arr) //a,b,c,2,d,e,f,g,3,4 方法一:使用toString方法先将arr转换为一个字符串, 再以split分割为数组,再将数组里面的元素转换为数字类型 var arr =['a', ['b', 'c'], 2, ['d', 'e', 'f'], 'g', 3, 4]; function flat(arr)

  • JS扁平化输出数组的2种方法解析

    这篇文章主要介绍了JS扁平化输出数组的2种方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.使用数组的flat方法 [1,2,[3,[4,5]]].flat(Infinity) //[1, 2, 3, 4, 5] 2.实现方式二: var arr = [[1, 2, 23], [13, 4, 5, 5], [6, 7, 9, [11, 12, [12, 13, [14]]]], 10]; var result = []; functi

  • JS数组扁平化(flat)方法总结详解

    需求:多维数组=>一维数组 let ary = [1, [2, [3, [4, 5]]], 6]; let str = JSON.stringify(ary); 第0种处理:直接的调用 arr_flat = arr.flat(Infinity); 第一种处理 ary = str.replace(/(\[\]))/g, '').split(','); 第二种处理 str = str.replace(/(\[\]))/g, ''); str = '[' + str + ']'; ary = JSON

  • JavaScript面试之如何实现数组拍平(扁平化)方法

    目录 1 什么叫数组拍平? 2 JS标准库中的数组拍平方法 3 实现一个flat方法 3.1 如何遍历一个数组 3.2 如何判断元素是否为数组 3.3 递归 3.4 初步实现flat方法 4 优化 4.1 指定展开深度 4.2 数组空位处理 4.2.1 for...of增加空位判断 4.2.2 forEach.map方法遍历 4.2.3 reduce方法 5 其他 5.1 栈 5.2 改进 总结 1 什么叫数组拍平? 概念很简单,意思是将一个"多维"数组降维,比如: // 原数组是一个

  • JavaScript数组常用方法解析及数组扁平化

    目录 前言 一.常用数组操作方法 push末尾追加元素 pop删除数组末尾元素 sort排序 shift数组开头添加元素 && unshift数组开头删除元素 数组合并concat indexOf查找元素 && includes查找元素是否存在 reverse反转数组 数组切割成字符串join slice操作数组,替换,删除,新增 every校验数组所有元素 some 测试数组中是不是至少有1个元素通过了被提供的函数测试.返回值是布尔值 深层次递归数组flat map遍历数

  • Javascript中的数组常用方法解析

    前言 Array是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array是前端必修的功课.周五啦,博主的心又开始澎湃了,明儿个周末有木有,又可以愉快的玩耍了. 创建数组 创建数组的基本方式有两种,一种字面量,另一种使用构造函数创建: var arr = [1,2,3]; //字面量的形式创建数组 值与值之间用英文逗号隔开 var arr = [1,2,3]; //字面量的形式创建数组 值与值之间用英文逗号隔开 var ar

  • javascript数组常用方法汇总

    本文为大家总结了javascript数组常用方法,具体内容如下 1.join()方法: Array.join()方法将数组中所以元素都转化为字符串链接在一起,返回最后生成的字符串.也可以指定可选的字符串在生成的字符串中来分隔数组的各个元素.如果不指定分隔符,默认使用逗号.案例如下: var a=[1,2,3]; a.join();//=> "1,2,3" 因为没有指定分隔符,默认为逗号. a.join("+");//=> "1+2+3"

  • JS前端面试数组扁平化手写flat函数示例

    目录 前言 题目 实现扁平化的方法 封装 flatten 1. ES6 flat 2. toString 3. 使用正则替换 4. 循环递归 4.1 循环 + concat + push 4.2 增加参数控制扁平化深度 4.3 巧用 reduce 4.4 使用 Generator 函数 5. 使用堆栈 stack 避免递归 6.while 循环+ some方法 前言 由于上半年参加了校招的技术面试, 前前后后面了20多个人了, 每次面试都会让应聘者手写一下数组扁平化flat(),但是发现居然没有

  • JavaScript之数组扁平化详解

    扁平化 数组的扁平化,就是将一个嵌套多层的数组 array (嵌套可以是任何层数)转换为只有一层的数组. 举个例子,假设有个名为 flatten 的函数可以做到数组扁平化,效果就会如下: var arr = [1, [2, [3, 4]]]; console.log(flatten(arr)) // [1, 2, 3, 4] 知道了效果是什么样的了,我们可以去尝试着写这个 flatten 函数了 递归 我们最一开始能想到的莫过于循环数组元素,如果还是一个数组,就递归调用该方法: // 方法 1

  • 5种 JavaScript 方式实现数组扁平化

    目录 一.数组扁平化概念 二.实现 1. reduce 2. toString & split 3. join & split 4. 递归 5. 扩展运算符 一.数组扁平化概念 数组扁平化是指将一个多维数组变为一维数组 [1, [2, 3, [4, 5]]] ------> [1, 2, 3, 4, 5] 二.实现 1. reduce 遍历数组每一项,若值为数组则递归遍历,否则concat. function flatten(arr) { return arr.reduce((res

  • JavaScript数组去重和扁平化函数介绍

    目录 1.数组扁平化(又称数组降维) 方法一:使用 reduce 方法 方法二:栈 2.数组去重 方式一:Set(ES6) 方式二:reduce 方法三:filter 1.数组扁平化(又称数组降维) flat() 方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回 const test = ["a", ["b", "c"], ["d", ["e", ["

  • js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解

    数组的扁平化:将多维数组变成一维数组 对于一个像这样的嵌套数组:a=[1,[2,[3,4]],5,6]我们想要把它变成一个一维数组,有下面几种方法: 方法一:递归一 function parseArr(arr,res){ var i=0; for(i=0;i<arr.length;i++){ if(arr[i] instanceof Array){ parseArr(arr[i],res); }else{ res.push(arr[i]); } } } var a=[1,[2,[3,4]],5,

随机推荐