js数组方法总结
数组与字符串转换
join&split
数组与字符串之间转换的方法
- join把数组转换成字符串,默认用
,
做分隔符,原数组不变
- split把字符串转换成数组,不改变原字符串
1 2 3 4 5 6
| const colors = 'green, red, black'; const colorsArr = colors.split(','); console.log(colorsArr); const colorsStr = colorsArr.join(','); console.log(colorsStr);
|
对数组首尾的操作
push&pop
push()
方法从数组末尾向数组添加元素,可以添加一个或多个元素。
pop()
方法用于删除数组的最后一个元素并返回删除的元素。
1 2 3 4 5 6 7 8
| var arr = ["Lily","lucy","Tom"]; var count = arr.push("Jack","Sean"); console.log(count); console.log(arr); var item = arr.pop(); console.log(item); console.log(arr);
|
shift&unshift
shift()
方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。
unshift()
方法可向数组的开头添加一个或更多元素,并返回新的长度。
1 2 3 4 5 6 7 8
| var arr = ["Lily","lucy","Tom"]; var count = arr.unshift("Jack","Sean"); console.log(count); console.log(arr); var item = arr.shift(); console.log(item); console.log(arr);
|
关于元素顺序
sort()
sort() 方法用于对数组的元素进行排序。
排序顺序可以是字母或数字,并按升序或降序。
默认排序顺序为按字母升序。(改变原数组)
1 2 3 4 5 6
| var arr1 = ["a", "d", "c", "b"]; console.log(arr1.sort()); arr2 = [13, 24, 51, 3]; console.log(arr2.sort()); console.log(arr2);
|
为了解决上述问题,sort()方法可以接收一个比较函数作为参数,以便我们指定哪个值位于哪个值的前面。
比较函数接收两个参数,如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等则返回 0,如果第一个参数应该位于第二个之后则返回一个正数。以下就是一个简单的比较函数:
1 2 3 4 5 6 7 8 9 10 11 12
| function compare(value1, value2) { if (value1 < value2) { return -1; } else if (value1 > value2) { return 1; } else { return 0; } } arr2 = [13, 24, 51, 3]; console.log(arr2.sort(compare));
|
reverse()
颠倒数组中元素的顺序
1 2 3 4
| var arr = [13, 24, 51, 3]; console.log(arr.reverse()); console.log(arr);
|
concat()
连接两个或多个数组
1 2 3 4 5
| var arr = [1,3,5,7]; var arrCopy = arr.concat(9,[11,13]); console.log(arrCopy); console.log(arr);
|
循环遍历相关的
forEach()
1 2 3 4 5 6 7 8 9 10 11 12 13
| var arr = [11, 22, 33, 44, 55]; arr.forEach(function(x, index, a){ console.log(x + '|' + index + '|' + (a === arr)); });
输出为:
11|0|true 22|1|true 33|2|true 44|3|true 55|4|true
|
会改变原数组吗
数组包含的是基本数据类型a,那么在在使用forEach时候,形参b会在栈中拷贝一份原数组的指针与值,此时a与b是完全独立的数据,我们在修改b的值时是不会影响到a的值。
数组包含的是引用数据类型a,那么在使用forEach的时候,形参b拷贝的是引用数据类型在栈中的地址,此时a和b都同时指向在一开始定义a时在堆中保存的数据,所以当我们修改b的数据,a的值也会改变,因为他们都是指向的堆中的同一数据。
map()
map()
方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map()
方法按照原始数组元素顺序依次处理元素。
该方法不会改变原数组
1 2 3 4 5
| var arr = [1, 2, 3, 4, 5]; var arr2 = arr.map(function(item){ return item*item; }); console.log(arr2);
|
some()
some():判断数组中是否存在满足条件的项,只要有一项满足条件,就会返回 true。
1 2 3 4 5 6 7 8 9 10
| var arr = [1, 2, 3, 4, 5]; var arr2 = arr.some(function(x) { return x < 3; }); console.log(arr2); var arr3 = arr.some(function(x) { return x < 1; }); console.log(arr3);
|
every()
判断数组中每一项是否满足条件,只有所有项都满足条件,才会返回true
1 2 3 4 5 6 7 8 9 10
| var arr = [1, 2, 3, 4, 5]; var arr2 = arr.every(function(x) { return x < 10; }); console.log(arr2); var arr3 = arr.every(function(x) { return x < 3; }); console.log(arr3);
|
reduce()
累加器
1 2 3 4 5 6
| var values = [1,2,3,4,5]; var sum = values.reduceRight(function(prev, cur, index, array){ return prev + cur; },10); console.log(sum);
|
关于这些函数是否会改变原数组,MDN是这样描述的
forEach()
不会改变其调用的数组,但是,作为 callbackFn
的函数可以更改数组。请注意,在第一次调用 callbackFn
之前,数组的长度已经被保存。