JavaScript里处理数组的一些常用方法
修改器方法:
1.pop() 方法从数组中删除最后一个元素
pop() 方法将删除 arrayObject 的最后一个元素,把数组长度减 1,并且返回它删除的元素的值。
let arr2 = ['zhao','qian','sun','li'];
console.log(arr2.pop()); //li
console.log(arr2) // ["zhao", "qian", "sun"]
如果数组已经为空,则 pop() 不改变数组,并返回 undefined 值。
let arr3 = [];
console.log(arr3.pop()); //undefined
console.log(arr3) // []
2.push() 方法(在数组结尾处)向数组添加一个新的元素
- push() 方法和 pop() 方法使用数组提供的先进后出栈的功能。
- push() 方法返回新数组的长度
var arr3 = ['zhao','qian','sun','li'];
arr3.push("zhou");
// 5
console.log(arr3); // ["zhao", "qian", "sun", "li", "zhou"];
3.shift() 方法会删除首个数组元素,并把所有其他元素“位移”到更低的索引。
- shift() 方法返回被“位移出”的字符串
var arr4 = ['zhao','qian','sun','li'];
arr4.shift();
// "zhao"
4.unshift() 方法(在开头)向数组添加新元素,并“反向位移”旧元素。
- unshift() 方法返回新数组的长度
var arr5 = ['zhao','qian','sun','li'];
arr5.unshift('zhou') ;
// 5
console.log(arr5); // ["zhou", "zhao", "qian", "sun", "li"]
5.splice()
- 可用于向数组添加新项。
splice(index,count,para1,para2..);
第一个参数(index)定义了应添加新元素的位置(拼接)。
第二个参数(count)定义应删除多少元素。
其余参数(para1,para2)定义要添加的新元素。
splice() 方法返回一个包含已删除项的数组
var arr8 = ['zhao','qian','sun','li'];
arr8.splice(2,0, 'Love','you'); // 在索引为2处删除了0个元素 返回的是被删除的数组 []
console.log(arr8);// ["zhao", "qian", "Love", "you", "sun", "li"]; var arr9 = ['zhao','qian','sun','li'];
arr9.splice(2,2, 'Love','you') //在索引为2处删除了2个元素 返回的是被删除的数组 ["sun", "li"]
console.log(arr9); // ["zhao", "qian", "Love", "you"]
6.使用splice()来删除元素。
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(0, 1); //["Banana"];
console.log(fruits) ; // ["Orange", "Apple", "Mango"] ; // 删除 fruits 中的第一个元素,删除数量为1
7.sort() 数组排序
字母顺序对数组进行排序。
var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
fruits.sort(); // ["Apple", "Banana", "Lemon", "Mango", "Orange"]
sort() 方法在对数值排序时会产生不正确的结果;
如果数字按照字符串来排序,则 "3" 大于 "11",因为 "3" 大于 "1"。
var arr = [3,5,1,6];
arr.sort(); // [1, 3, 5, 6];
var arr = [3,5,11,6];
arr.sort(); // [11, 3, 5, 6];
我们通过一个比值函数来修正此问题
var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});
(6) [1, 5, 10, 25, 40, 100]
使用相同的技巧对数组进行降序排序
var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});//[100, 40, 25, 10, 5, 1]
补充:arr.sort([compareFunction]) 用来指定按某种顺序进行排列的函数
如果指明了 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)
必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。
8.reverse() 方法反转数组中的元素。
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.reverse(); //["Mango", "Apple", "Orange", "Banana"]
9.fill()
方法用一个固定值填充一个数组中从起始索引到终止索引内的全部元素。不包括终止索引。
语法:arr.fill(value[, start[,end]]); 不改变数组的长度
var array1 = [1, 2, 3, 4]; // fill with 0 from position 2 until position 4
console.log(array1.fill(0, 2, 4));
// expected output: [1, 2, 0, 0] // fill with 5 from position 1
console.log(array1.fill(5, 1));
// expected output: [1, 5, 5, 5] console.log(array1.fill(6));
// expected output: [6, 6, 6, 6]
10.copyWinthin()方法浅复制数组的一部分到同一数组中的另一个位置,并返回它,不会改变原数组的长度。
arr.copyWithin(target[, start[, end]])
var array1 = ['a', 'b', 'c', 'd', 'e'];
console.log(array1.copyWithin(0, 3, 4));
//["d", "b", "c", "d", "e"]
截取下标3-4之间的元素为,d,替换掉数组下标为0的位置的元素即替换 a;所以输出为 ["d", "b", "c", "d", "e"]
11.flat()方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。
- 一个包含将数组与子数组中所有元素的新数组。
var arr1 = [1, 2, [3, 4]];
arr1.flat();
// [1, 2, 3, 4] var arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]] var arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2);
// [1, 2, 3, 4, 5, 6]
- flat()方法会移除数组中的空项
var arr4 = [1, 2, , 4, 5];
arr4.flat();
// [1, 2, 4, 5]
使用reduce() contact() 可以实替代flat
var arr1 = [1, 2, [3, 4]];
arr1.flat(); // [1,2,3,4] // 反嵌套一层数组
arr1.reduce((acc, val) => acc.concat(val), []);// [1, 2, 3, 4] // 或使用 ...
const flatSingle = arr => [].concat(...arr);
12. flatmp()方法首先使用映射函数映射每个元素,然后将结果压缩成一个新数组。它与map和 深度值1的 flat几乎相同,但 flatmpa通常在合并成一种方法的效率稍微高一些。
var arr1 = [1, 2, 3, 4]; arr1.map(x => [x * 2]);
// [[2], [4], [6], [8]] arr1.flatMap(x => [x * 2]);
// [2, 4, 6, 8] // 只会将 flatMap 中的函数返回的数组 “压平” 一层
arr1.flatMap(x => [[x * 2]]);
// [[2], [4], [6], [8]]
let arr = ["今天天气不错", "", "早上好"] arr.map(s => s.split(""))
// [["今", "天", "天", "气", "不", "错"],[],["早", "上", "好"]] arr.flatMap(s => s.split(''));
// ["今", "天", "天", "气", "不", "错", "早", "上", "好"]
13.更改元素还可以下操作
- 通过使用它们的索引号来访问数组元素;
var arr6 = ['zhao','qian','sun','li'];
arr6[0] = 'shi' ; //"shi"
console.log(arr6); // ["shi", "qian", "sun", "li"]; // 把 arr6的第一个元素改为 "shi" var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits[4] = "Kiwi"; //Liwi
console.log(fruits) ; // ["Banana", "Orange", "Apple", "Mango", "Kiwi"] // 在 fruits 的数组内增加 "Kiwi"
- length 属性提供了向数组追加新元素的简易方法。
var arr7 = ['zhao','qian','sun','li'];
arr7[arr7.length] = 'shi'; //shi
console.log(arr7); // ["zhao", "qian", "sun", "li", "shi"]
访问方法
下面的这些方法不会改变调用它们的对象的值,只会返回一个新的数组或者返回一个其它的期望值。
3个转成字符串的(join toString toLocaleString)
1.toString() 把数组转换为数组值(逗号分隔)的字符串。
let arr2 = ['zhao','qian','sun','li'];
console.log(arr2.toString()); //zhao,qian,sun,li
2.join() 方法也可将所有数组元素结合为一个字符串。
- 元素是通过指定的分隔符进行分隔的。
- 默认为‘,‘
let arr2 = ['zhao','qian','sun','li'];
console.log(arr2.join()); //zhao,qian,sun,li console.log(arr2.join(' ')); //zhao qian sun li
3.toLocaleString();
两个获取下标 (indexOf,lastIndexOf)
4.indexof()方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。
查找数组中 "Apple" 的元素, 在数组的第四个位置开始检索:
var fruits=["Banana","Orange","Apple","Mango","Banana","Orange","Apple"];
var a = fruits.indexOf("Apple",4);
console.log(a); //6
5.lastIndexOf()方法返回指定元素(也即有效的 JavaScript 值或变量)在数组中的最后一个的索引,如果不存在则返回 -1
var animals = ['Dodo', 'Tiger', 'Penguin', 'Dodo']; console.log(animals.lastIndexOf('Dodo'));
// 3 console.log(animals.lastIndexOf('Tiger'));
// 1
var animals = ['Dodo', 'Tiger', 'Penguin', 'Dodo']; console.log(animals.lastIndexOf('Dodo'));
// expected output: 3 console.log(animals.lastIndexOf('Tiger'));
// expected o
两个返回数组(concat ,slice)
6.concat() 方法通过合并(连接)现有数组来创建一个新数组。
let arr = [1,2,3];
console.log(arr.concat(4,5)); //[1, 2, 3, 4, 5] let arr2 = ['zhao','qian','sun','li'];
console.log(arr2.concat('zhou')); //["zhao", "qian", "sun", "li", "zhou"]
//concat() 连接两个数组
console.log(arr.concat(arr2)); //[1, 2, 3, "zhao", "qian", "sun", "li"]
7.slice() 方法用数组的某个片段切出新数组。
- slice() 方法用数组的某个片段切出新数组。
- slice() 方法创建新数组。它不会从源数组中删除任何元素。
- slice(start,end)直接切出新数组
本例从数组元素 1 ("Orange")开始切出一段数组。
var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
var citrus = fruits.slice(1);
console.log(citrus) //["Orange", "Lemon", "Apple","Mango"];返回新数组
console.log(fruits ); // ["Banana", "Orange", "Lemon", "Apple", "Mango"] 原数组不发生变化
slice() 可接受两个参数,比如 (1, 3)介于两个指定下标之间的元素。
var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
var citrus = fruits.slice(1, 3);
console.log(citrus); // ["Orange", "Lemon"]
console.log(fruits); // ["Banana", "Orange", "Lemon", "Apple", "Mango"]
一个做判断 includes
8.includes()方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回false。
arr.includes(searchElement, fromIndex)
[1, 2, 3].includes(2); // true
[1, 2, 3].includes(4); // false
如果 fromIndex
为负值,计算出的索引将作为开始搜索searchElement
的位置。如果计算出的索引小于 0,则整个数组都会被搜索。
如果 fromIndex
大于等于数组的长度,则会返回 false
,且该数组不会被搜索。
[1, 2, 3].includes(2,-1); // true
[1, 2, 3].includes(3,1); //true
[1, 2, 3].includes(3,4); //false
迭代器:
1.forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。
- forEach() 对于空数组是不会执行回调函数的。
array.forEach(function(currentValue, index, arr), thisValue)
callback
函数会被依次传入三个参数:- 数组当前项的值
- 数组当前项的索引
- 数组对象本身
var array1 = ['a', 'b', 'c']; array1.forEach((element) => {
console.log(element);
}); // a b c
const items = ['item1', 'item2', 'item3'];
const copy = []; // before
for (let i=0; i<items.length; i++) {
copy.push(items[i]);
} // after
items.forEach(function(item){
copy.push(item);
});
2.map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。
var array1 = [1, 4, 9, 16]; // pass a function to map
const map1 = array1.map(x => x * 2); console.log(map1);
// expected output: Array [2, 8, 18, 32]
3.filter()法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
语法: var newArray = arr.filter(callback(element[, index[, array]])[, thisArg]);
callback用来测试数组的每个元素的函数。返回true表示该元素通过测试,保留该元素,false则不保留
var words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
const result = words.filter(word => word.length > 6);
console.log(result);
// ["exuberant", "destruction", "present"]
下例使用filter创建了一个新数组,该数组的元素由原数组中值大于 10 的元素组成。
function isBigEnough(element) {
return element >= 10;
}
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
// filtered is [12, 130, 44]
两个判断(every some)
4.every()方法测试一个数组内的所有元素是否都能通过某个指定函数的测试。它返回一个布尔值。
- 语法:arr.every(callback[, thisArg])
举例:判断一个数组里面的值是否都小于40
function isBelowThreshold(currentValue) {
return currentValue < 40;
}
var array1 = [1, 30, 39, 29, 10, 13];
console.log(array1.every(isBelowThreshold));
//true
5.some()方法测试数组中是不是有元素通过了被提供的函数测试。它返回的是一个Boolean类型的值。
var array = [1, 2, 3, 4, 5]; var even = function(element) {
// checks whether an element is even
return element % 2 === 0;
}; console.log(array.some(even));
// true
utput: 1
两个查找(find findIndex)
6.find()方法返回数组中满足提供的测试函数的第一个元素的值。否则返回undefined
var array1 = [5, 12, 8, 130, 44];
var found = array1.find(function(element) {
return element > 10;
});
console.log(found);
// 12
function isBigEnough(element) {
return element >= 999;
}
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
//undefined
7.findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1。
var array1 = [5, 12, 8, 130, 44];
function isLargeNumber(element) {
return element > 10;
}
console.log(array1.findIndex(isLargeNumber));
//1
arr.findIndex(callback [ ])
callback针对数组中的每个元素, 都会执行该回调函数, 执行时会自动传入下面三个参数:
- element当前元素;
- index 当前元素索引;
- array 调用findIndex的数组
8.reduce()对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。
- reducer 函数接收4个参数:
- Accumulator (acc) (累计器)
- Current Value (cur) (当前值)
- Current Index (idx) (当前索引)
- Source Array (src) (源数组)
[0, 1, 2, 3, 4].reduce(function(accumulator, currentValue, currentIndex, array){
return accumulator + currentValue;
});
//10
如果没有提供initialValue
,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue
,从索引0开始。
callback 被调用四次,每次调用的参数和返回值如下表:
callback |
accumulator |
currentValue |
currentIndex |
array |
return value |
---|---|---|---|---|---|
first call | 0 |
1 |
1 |
[0, 1, 2, 3, 4] |
1 |
second call | 1 |
2 |
2 |
[0, 1, 2, 3, 4] |
3 |
third call | 3 |
3 |
3 |
[0, 1, 2, 3, 4] |
6 |
fourth call | 6 |
4 |
4 |
[0, 1, 2, 3, 4] |
10 |
三个返回Iterator 的方法(keys values entries)
9. entries()方法返回一个新的Array Iterator对象,该对象包含数组中每个索引的键/值对
var array1 = ['a', 'b', 'c']; var iterator1 = array1.entries(); console.log(iterator1.next().value);
// expected output: Array [0, "a"] console.log(iterator1.next().value);
// expected output: Array [1, "b"]
10.keys()方法返回一个包含数组中每个索引键的Array Iterator
对象。
11.valuse()方法返回一个新的 Array Iterator
对象,该对象包含数组每个索引的值
JavaScript里处理数组的一些常用方法的更多相关文章
- 转 JavaScript里的数组转化新方法Array.From
过去,我们使用各种各样的方法来将类似Array对象的东西(比如 arguments 和 NodeList) 转换成真的数值.比如下面这个: 将NodeList转换成数组 基本上,这些东西我们都可以使用 ...
- JavaScript里处理数字的一些常用方法
1.toString() 把字符串转换为数值. let num = 123; console.log(typeof(num)); //number console.log(typeof(num.toS ...
- JavaScript里处理字符串的一些常用方法
1.length 属性返回字符串的长度 let srt = "hello world!"; console.log(srt.length) // 12 2.indexOf() 方法 ...
- 前端开发:Javascript中的数组,常用方法解析
前端开发:Javascript中的数组,常用方法解析 前言 Array是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array ...
- JavaScript中的数组详解
JavaScript中的数组 一.数组的定义 数组是值的有序集合,或者说数组都是数据的有序列表. 二.创建数组 [字面量形式] 1.空数组 var arr=[]; 2.带有元素的数组 var arr= ...
- JavaScript 基础回顾——数组
JavaScript是无类型语言,数组元素可以具有任意的数据类型,同一个数组的不同元素可以具有不同类型.数组的元素设置可以包含其他数组,便于模拟创建多维数组. 1.创建数组 在JavaScript中, ...
- 翻阅《数据结构与算法javascript描述》--数组篇
导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...
- JavaScript里的依赖注入
JavaScript里的依赖注入 我喜欢引用这句话,“程序是对复杂性的管理”.计算机世界是一个巨大的抽象建筑群.我们简单的包装一些东西然后发布新工具,周而复始.现在思考下,你所使用的语言包括的一些内建 ...
- 第一百零三节,JavaScript对象和数组
JavaScript对象和数组 学习要点: 1.Object类型 2.Array类型 3.对象中的方法 什么是对象,其实就是一种类型,即引用类型.而对象的值就是引用类型的实例.在ECMAScript中 ...
随机推荐
- JVM 源码分析(二):搭建 JDK 8 源码调试环境(Windows 上使用 CLion)
前言 一.准备源码 二.安装 "Bootstrap JDK" 三.配置编译环境 四.编译与测试 五.安装 CMake 和 GDB 五.准备远程调试 六.开始远程调试 前言 上一篇文 ...
- 阿里面试官:什么是MySQL索引,为什么要有索引?
一.什么是索引? 索引就好比字典的目录一样 我们通常都会先去目录查找关键偏旁或者字母再去查找 要比直接翻查字典查询要快很多 二.为什么要有索引? 然而我们在使用mysql数据库的时候也像字典一样有索引 ...
- Linux Bash Shell常用快捷键
Linux Bash Shell常用快捷键 table { margin: auto } 快捷键 功能 tab 补全 ctrl + a 光标回到命令行首 ctrl + e 光标回到命令行尾 ctrl ...
- IDEA一步步创建Maven管理的Spring入门程序
目前,做Java开发的很多人都在使用IDEA了,而有些人也选择用Eclipse,我这里介绍一下IDEA一步步创建Maven项目的步骤,并创建一个Spring的入门程序(Java项目,非Web项目),讲 ...
- explain select * from xuehao;
mysql> explain select * from xuehao;+----+-------------+--------+------+---------------+------+-- ...
- Linux—curl命令讲解
命令:curl 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具 ...
- Javadoc命令与API
Javadoc命令与API Javadoc工具会抽取类,成员,方法的文档注释生成与这个类配套的API帮助文档 Javadoc命令和文档注释小公司基本不用,但我们应养成良好的编码习惯,所以还是了解一下 ...
- 10_1_OS模块
1.常用函数目录 函数名 功能 os.name 指示用户正在使用的工作平台 os.getcwd ( ) 获取当前的工作目录 os.listdir ( ) 返回指定目录下的所有文件和目录名 os.rem ...
- PWN_ret2text,ret2syscall,ret2shellcode
首先了解下Linux中的保护机制(具体的绕过等后续再说) 1.canary(栈保护) 在函数开始时就随机产生一个值,将这个值CANARY放到栈上紧挨ebp的上一个位置,当攻击者想通过缓冲区溢出覆盖eb ...
- 转 2 jmeter常用功能介绍-测试计划、线程组
2 jmeter常用功能介绍-测试计划.线程组 1.测试计划测试用来描述一个性能测试,所有内容都是基于这个测试计划的. (1)User Defined Variables:设置用户全局变量.一般添 ...