Array常见用法
var arr = ['black', 'red', 'yellow', 'green', 'white']
- 追加元素:
push添加元素到数组末尾;unshift添加元素到数组头部;两者均是修改器方法,直接改变自身的值。
arr.push('pink') // 输出 6
console.log(arr) // 输出 (6) ["black", "red", "yellow", "green", "white", "pink"]
arr.unshift('blue') // 输出 7
console.log(arr) // 输出 (6) ["blue", "black", "red", "yellow", "green", "white", "pink"]
- 删除元素:
pop删除数组末尾元素;shift删除数组头部元素;splice通过索引删除某个元素;三者均是修改器方法,直接改变自身的值。
arr.pop() // 输出 "pink"
console.log(arr) // 输出 (6) ["blue", "black", "red", "yellow", "green", "white"]
arr.shift() // 输出 "blue"
console.log(arr) // 输出 (5) ["black", "red", "yellow", "green", "white"]
arr.splice(arr.indexOf('yellow'), 1) // 输出 ["yellow"]
console.log(arr) // 输出 (4) ["black", "red", "green", "white"]
- 数组抽取、复制:
slice抽取数组中某段元素合成一个新数组arr.slice([begin[, end]]);是访问方法,不会改变原数组对象的值,而是返回一个新的数组对象。
arr.slice() // 数组复制 输出(4) ["black", "red", "green", "white"]
arr.slice(2) // 数组抽取 输出 (2) ["green", "white"]
arr.slice(-2) // 数组抽取 输出 (2) ["green", "white"]
// 数组抽取(倒数第几个元素结束抽取但不包括)
arr.slice(2, -1) // 输出 (1) ["green"]
// 数组抽取(第1,2个元素,不包括索引3)
arr.slice(1, 3) // 输出 (2) ["red", "green"]
console.log(arr) // 源头数组 输出 (4) ["black", "red", "green", "white"]
- 数组拼接:
concat将当前数组与其他若干数组组合成新数组var new_array = old_array.concat(value1[, value2[, ...[, valueN]]]);是访问方法,不会改变原数组对象的值,而是返回一个新的数组对象。
var arr2 = ['apple', 'lemon', 'juice']
arr.concat(arr2) // 输出 (7) ["black", "red", "green", "white", "apple", "lemon", "juice"]
console.log(arr) // 源头数组 输出 (4) ["black", "red", "green", "white"]
递归求和
---- Number ----
// 示例1
function sum(num1, num2) {
let num = num1 + num2;
if (num2 + 1 > 100) {
return num;
}
return sum(num, num2 + 1);
}
console.log(sum(1,2))
// 示例2
function sum(total) {
if (total === 1) {
return 1;
}
return total + sum(total - 1);
}
console.log(sum(100))
---- Array ----
var arr = [1,2,3,4,5,6]
// 示例1
let arrSum = arr.reduce((per,cur) => {
return per+cur;
}, 0)
console.log(arrSum());
// 示例2
let res = 0;
arr.forEach(item => {
res += item;
})
console.log(res);
特别注意:Object.assign()拷贝的只是属性值,假设源对象属性值指向引用的对象,那此时拷贝的是引用地址值。总结,源对象的属性值为简单类型,此拷贝为深拷贝;若源对象的属性值是其他引用类型,则为浅拷贝。
Tips:为了不修改引用类型结构,可深拷贝数据到新变量进行计算。常用方法如JSON.parse(JSON.stringfy(arr))。再者call、apply、bind([].slice.call(arr, 0),[].slice.apply(arr, [0]),[].slice.bind(arr, [0])())。
引用类型之数组比较:Object.prototype.toString.call(arr) === "
[object Array]";引用类型之对象比较:Object.prototype.toString === "[object Object]"
数组去重
- 过滤器
Array.prototype.filter()
// 源数组不变
function uniqueArr(arr) {
if (!Array.isArray(arr)) return;
arr.filter((item, index)=> {return arr.indexOf(item, 0) === index;})
}
console.log(uniqueArr(arr));
- 二维遍历&
Array.prototype.splice()
// 源数组变
function uniqueArr(arr) {
if (!Array.isArray(arr)) return;
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j]) {
arr.splice(j, 1);
}
}
}
return arr;
}
console.log(uniqueArr(arr));
- 遍历&
Array.prototype.indexOf()&Array.prototype.push()
// 源数组不变
function uniqueArr(arr) {
if (!Array.isArray(arr)) return;
let newArr = [];
for (let i = 0; i < arr.length; i++) {
if (newArr.indexOf(arr[i]) === -1) { // 返回值索引值,不存在返回-1
newArr.push(arr[i]);
}
}
return newArr;
}
console.log(uniqueArr(arr));
- 遍历&
Array.prototype.includes()类似方法3,检查是否存在某个值newArr.includes(item),返回值布尔类型 - ES6
Set
数组扁平化
Array.prototype.flat()方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。此方法会移除数组中的空项:
var multiArr = [1, 2, [3, , 4, [, 5, 6]]];
multiArr.flat(2); // 输出[1, 2, 3, 4, 5, 6],源数组不变
- 替代方案reduce、contact
学习是一场修行
-- 不积跬步,无以至千里