JS Array ing……

148 阅读3分钟

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))。再者callapplybind([].slice.call(arr, 0),[].slice.apply(arr, [0]),[].slice.bind(arr, [0])())。

引用类型之数组比较:Object.prototype.toString.call(arr) === "[object Array]";引用类型之对象比较:Object.prototype.toString === "[object Object]"

数组去重

  1. 过滤器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));
  1. 二维遍历&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));
  1. 遍历&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));
  1. 遍历&Array.prototype.includes()类似方法3,检查是否存在某个值newArr.includes(item),返回值布尔类型
  2. ES6 Set

数组扁平化

  1. Array.prototype.flat()方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。此方法会移除数组中的空项:
    var multiArr = [1, 2, [3, , 4, [, 5, 6]]];
    multiArr.flat(2); // 输出[1, 2, 3, 4, 5, 6],源数组不变
  1. 替代方案reduce、contact

编组 6@2x.png学习是一场修行
-- 不积跬步,无以至千里