本文主要从应用来讲数组api的一些操作,如一行代码扁平化n维数组、数组去重、求数组最大值、数组求和、排序、对象和数组的转化等。
ES10扁平数组的api, n表示维度, n值为 Infinity时维度为无限大。
Array.flat(n)
[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[...]].flat(Infinity) //[1,2,3,4...n]
先判断是否有嵌套数组,有的情况下,...arr
展开操作每次能去除一层嵌套数组,直到去除掉所有嵌套数组为止
function flatten(arr) {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
flatten([1, [2, 3]]); //[1,2,3]
flatten([1, [2, 3, [4, 5]]]); //[1,2,3,4,5]
利用集合set不重复的特性:set是ES6新出来的一种一种定义不重复数组的数据类型
Array.from
是将类数组转化为数组
...
是扩展运算符,将set里面的值转化为arg1,arg2,arg3
(类似数组的toString
)
Array.from(new Set([1,2,3,3,4,4])) //[1,2,3,4]
[...new Set([1,2,3,3,4,4])] //[1,2,3,4]
let obj = {};//对照对象
for (var i = 0; i < result2.length; i++) {
// 判断当前项是否遍历过,是则删除,否存入obj以作对照
if (obj[result2[i]]) {
result2.splice(i, 1);
i--; //数组删除了一项,要把i回退一下,不然会跳过下一项不去遍历
} else {
obj[result2[i]] = 1;
}
}
arrayObject.sort(sortby)
sortby可选。规定排序顺序。必须是函数。
[1,2,3,4].sort(); // [1, 2,3,4],默认是升序
[1,2,3,4].sort((a, b) => b - a); // [4,3,2,1] 降序
冒泡排序
快速排序
选择排序
max()
Math.max(n1,n2,n3,...,nX)
max() 方法可返回两个指定的数中带有较大的值的那个数
n1,n2,n3,…,nX 可选。1 或多个值。在 ECMASCript v3 之前,该方法只有两个参数。
返回值:参数中最大的值。如果没有参数,则返回 -Infinity。如果有某个参数为 NaN,或是不能转换成数字的非数字值,则返回 NaN。
http://www.runoob.com/jsref/jsref-max.html
Math.max(...[1,2,3,4]) //4
Math.max.apply(this,[1,2,3,4]) //4
reduce()
迭代比较(兼容max方法只支持两个参数的情况)reduce是ES5的数组api,参数有函数和默认初始值;
函数有四个参数,pre(上一次的返回值),cur(当前值),curIndex(当前值索引),arr(当前数组)
[1,2,3,4].reduce((prev, cur)=> (
Math.max(prev,cur))
,0)//4
例题
/**第一题
* 说明:获取一个数字数组中的最大值
* 示例:
* 输入:[1, 5, 3, 9, 2, 7]
* 输出:9
*/
var arr = [1, 5, 3, 9, 2, 7];
//方法一
Math.max(...arr);//9
//方法二
Math.max.apply(this,arr);//9
Math.max.call(this,...arr);//9
//方法三
arr.reduce((prev, cur)=> (
Math.max(prev,cur))
,0)//9
//添加原型方法
Solution.prototype.shuffle = function() {
//交换数组元素顺序
const swap = (a, i, j) => {
[a[i], a[j]] = [a[j], a[i]];
};
let arr = this.nums.slice(); //深拷贝数组,不然会改变this.nums,影响reset的输出
for (let i = arr.length - 1; i >= 0; i--) {//从后往前遍历数组
//swap(arr, i, Math.floor(Math.random() * (arr.length - i + 1))); //每次
swap(arr, i, Math.floor(Math.random() * i+1));//交换i和0-i中随机位置的元素
}
return arr;
};
参考 https://segmentfault.com/a/1190000018549643
题目
移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回
思路
特殊情况
,空数组,但数组splice
方法影响接下来的遍历,从后往前
遍历数组function removeWithoutCopy(arr, item) {
if (arr.length === 0) return []; //空数组
if (arr.length === 1) return item === arr[0] ? arr : []; //单个元素数组
for (var i = arr.length - 1; i >= 0; i--) {
//从后往前遍历,每次删除以后不用重新修改i
arr[i] === item ? arr.splice(i, 1) : "";
}
return arr;
}
题目1
在数组 arr 末尾添加元素 item。不要直接修改数组 arr,结果返回新的数组
.concat()
方法会返回一个新数组
function append(arr, item) {
return arr.concat(item);
}
题目2
在数组 arr 开头添加元素 item。不要直接修改数组 arr,结果返回新的数组
注意添加的顺序:
function prepend(arr, item) {
return [].concat(item,arr);
}
题目1
删除数组 arr 最后一个元素。不要直接修改数组 arr,结果返回新的数组
思路
1.使用不修改原数组的删除api——slice
2.使用修改原数组的删除api——splice/pop/shift
,为了不修改原来的数组,需要先拷贝数组arr.slice(0),from,[...arr]
都可以实现深拷贝
3. .pop()
方法返回的是出栈元素,这里要求返回修改后的数组
function truncate(arr) {
var res = arr.slice(0);
res.pop();
return res;
}
题目2
删除数组 arr 第一个元素。不要直接修改数组 arr,结果返回新的数组
function curtail(arr) {
return arr.slice(1);
}
题目
在数组 arr 的 index 处添加元素 item。不要直接修改数组 arr,结果返回新的数组
思路
function insert(arr, item, index) {
var res = arr.slice(0);
res.splice(index,0,item);
return res;
}