- Array.prototype.pop()
- Array.prototype.push()
- Array.prototype.reduce()
- Array.prototype.reduceRight()
- Array.prototyp.reverse()
- Array.prototype.shift()
- Array.prototype.slice()
- Array.prototype.some()
- Array.portotype.sort()
- Array.prototype.splice()
- Array.prototype.toString()
- Array.prototype.unshift()
- Array.prototype.values()
- 多维数组转一维数组
Array.prototype.pop()
删除数组最后一个元素,并返回该元素的值。
如果在一个空数组上调用pop(), 它返回undefined.
Array.prototype.push()
将一个或多个元素添加到数组的末尾,并返回该数组的新长度。
var sports = ['soccer', 'baseball']
var total = sports.push('football', 'swimming') // ['soccer', 'baseball', 'football', 'swimming']
合并两个数组
使用apply() 添加第二个数组的所有元素
当第二个数组太大时不要使用这个方法来合并数组,事实上一个函数能够接受的参数个数是有限制的。
var vegetables = ['parsnip', 'potata']
var moreVegs = ['celery', 'beetroot']
Array.prototype.push.apply(vegetables, moreVegs)
console.log(vegetables) // ['parsnip', 'potato', 'celery', 'beetroot']
Array.prototype.reduce()
reduce() 对数组中的每个元素执行一个由你提供的reducer函数(升序执行),将其结果汇总为单个返回值。
reducer 函数接收4个参数:
acc 累计器
cur 当前值
idx 当前索引
src 源数组
返回值: 函数累计处理的结果
示例:
// 数组里所有值的和
let arr = [0, 1, 2, 3]
var total = arr.reduce((acc, cur) => acc + cur, 0)
// 累加对象数组里的值
let sum = [{x: 1}, {x: 2}, {x: 3}].reduce((acc, cur) => acc + cur.x, 0)
// 二维数组转化为一维
var flattened = [[0, 1], [2, 3], [4, 5]].reduce((acc, cur) => acc.concat(cur), [])
// 计算数组中每个元素出现的次数
var names = ['Alice', 'Bob', 'Tiff', 'Brue', 'Alice']
var countNames = names.reduce(function(allNames, name) {
if (name in allNames) {
allNames[name]++
} else {
allNames[name] = 1
}
return allNames
}, {})
// {'Alice': 2, 'Bob': 1, 'Bruce': 1}
按属性对Object 分类
var people = [
{name: 'Alice', age: 21},
{name: 'Max', age: 20},
{name: 'Jane', age: 20}
]
function groupBy(objArr, property) {
return objArr.reduce(function(acc, obj) {
var key = obj[prototype];
if (!acc[key]) {
acc[key] = []
}
acc[key].push(obj)
return acc
}, {})
}
var groupedPeople = groupBy(people, 'age')
使用扩展运算符将数组对象中的数组合并成一个新的 数组
var friends = [{
name: 'Anna',
books: ['Bible', 'Harry Potter'],
age: 21
}, {
name: 'Bob',
books: ['War and peace', 'Romeo and Juliet'],
age: 26
}, {
name: 'Alice',
books: ['The Lord of the Rings', 'The Shining'],
age: 18
}];
var allbooks = friends.reduce(function(prev, curr) {
return [...prev, ...curr.books]
}, ['Alphabet'])
数组去重
let arr = [1, 2, 1, 2, 3, 4, 5, 3, 4, 4, 4]
let result = arr.sort().reduce((init, current) => {
if (init.length === 0 || init[init.length - 1] === current) {
init.push(current)
}
return init
}, [])
// result [1, 2, 3, 4, 5]
Array.prototype.reduceRight()
reduceRight() 接受一个函数作为累加器和数组的每个值(从右到左)将其减少为单个值。
示例:
// 求一个数组中所有值的和
var total = [0, 1, 2, 3].reduceRight(function(a, b) {
return a + b
})
// 扁平化
var flattened = [[0, 1], [2, 3], [4, 5]].reduceRigth(function(a, b) {
return a.concat(b)
}, [])
// [4, 5, 2, 3, 0, 1]
reduce 与 reduceRight 之间的区别
var a = ['1', '2', '3', '4', '5']
var left = a.reduce(function(prev, cur) { return prev + cur }) // left: '12345'
var right = a.reduceRight(function(prev, cur) { return prev + cur }) // right: '54321'
Array.prototyp.reverse()
将数组中元素的位置颠倒,并返回该数组。该方法会改变原数组。
var sourceArray = ['one', 'two', 'three']
var reverseArray = sourceArray.reverse()
Array.prototype.shift()
shift() 从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度。
如果数组为空返回undefined.
Array.prototype.slice()
【包左不包右】
slice() 返回一个新的数组对象,这一对象是一个由begin 和 end 决定的原数组的浅拷贝。原数组不会被改变。
如果该元素是个对象引用,slice 会拷贝这个对象引用到新的数组里。两个对象引用都引用了同一个对象。如果被引用的对象发生改变,则新的和原来的数中的这个元素也会发生改变。
// 语法
arr.slice(); [0, end]
arr.slice(begin); [begin, end]
arr.slice(begin, end); [begin, end]
Array.prototype.some()
some() 测试是否至少有一个元素通过由提供的函数实现的测试。
对于放在空数组上的任何调价,此方法返回 false
返回值: boolean
console.log([2, 3, 4].some(v => v > 4));
Array.portotype.sort()
sort() 用原地算法对数组的元素进行排序,并返回数组。
比较数字而非字符串,比较函数可以简单以 a - b.
var numbers = [4, 2, 5, 1, 3];
numbers.sort((a, b) => a - b) // [1, 2, 3, 4, 5]
numbers.sort((a, b) => b - a); // [5, 4, 3, 2, 1]
Array.prototype.splice()
splice() 通过删除或替换现有元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。
array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
//返回值 由被删除的元素组成的一个数组。如果只删除了一个元素,则返回只包含一个元素的数组。
如果没删除元素,则返回空数组。
示例:
// 从第二位开始删除0个元素,插入‘drum’
var myFish = ['angel', 'clown', 'mandarin', 'surgeon']
var removed = myFish.splice(2, 0, 'drum')
// myFish ['angel', 'clown', 'drum', 'mandarin', 'surgeon']
// removed []
// 从第二为开始删除0个元素,插入‘drum’和 ‘guitar’
var myFish2 = ['angel', 'clown', 'mandarin', 'surgeon']
var removed2 = myFish.splice(2, 0, 'drum', 'guitar')
// 从第三位开始删除1个元素
var myFish3 = ['angel', 'clown', 'mandarin', 'surgeon']
var rmoved3 = myFish3.splice(3, 1)
// 从第四为开始删除1位元素,插入‘trumpet’
var myFish5 = ['angel', 'clown', 'mandarin', 'surgeon']
var removed5 = myFish5.splice(2, 1, 'trumpet')
// 从第0位开始删除2个元素,插入‘parrot’, ‘anemone’ 和 ‘blue’
var myFish6 = ['angel', 'clown', 'mandarin', 'surgeon']
var removed6 = myFish6.splice(0, 2, 'parrot', 'anemone', 'blue')
// 从第2位开始删除2个yuans
var myFish7 = ['angel', 'clown', 'mandarin', 'surgeon']
var removed7 = myFish7.splice(2, 2)
// 从倒数第2位开始删除1个元素
var myFish8 = ['angel', 'clown', 'mandarin', 'surgeon']
var removed8 = myFish8.splice(-2, 1)
// 从第2位开始删除所有元素
var myFish9 = ['angel', 'clown', 'mandarin', 'surgeon']
var removed9 = myFish9.splice(2)
Array.prototype.toString()
toString() 返回一个字符串,标识制定的数组及其元素。
var arr1 = [1, 2, 'a', '1a']
let output = array1.toString() // '1,2,a,1a'
Array.prototype.unshift()
unshift() 将一个或多个元素添加到数组的开头,并返回该数组的新长度。
arr.unshift(alement1, ..., elementN)
var arr = [1, 2]
arr.unshift(0) // arr => [0, 1, 2]; 返回 3
var arr1 = [1, 2]
arr1.unshift(-2, -1) // arr1 => [-2, 1, 1, 2]; 返回 4
var arr2 = [1, 2]
arr2.unshift([-3]) // arr2 => [[-3], 1, 2]; 返回 3
Array.prototype.values()
values() 返回一个新的Array Iterator 对象,该对象包含数组每个索引的值。
// 使用 for .. of 循环进行迭代
let arr = ['w', 'y', 'k', 'o', 'p']
let eArr = arr.values()
for (let letter of eArr) {
console.log(letter)
}
// 另一种迭代方式
let arr = ['w', 'y', 'k', 'o', 'p'];
let eArr = arr.values()
console.log(eArr.next().value); // w
console.log(eArr.next().value); // y
console.log(eArr.next().value); // k
console.log(eArr.next().value); // o
console.log(eArr.next().value); // p
多维数组转一维数组
// 使用generator函数
let arr = [1, [[2, [0, [0, 2, 0], 1, 9], 3], 4], [5, 6]]
let flat = function* (a) {
let len = a.length
for (let i = 0; i < len; i++) {
let item = a[i]
if (typeof item !== "number") {
yield* flat(item)
} else {
yield item
}
}
}
let flatArr = flat(arr)
// for 循环
let arr = [1, [[2, [0, [0, 2, 0], 1, 9], 3], 4], [5, 6]];
let result = [];
function swtichArr(arr = []) {
for (let item of arr) {
if (Array.isArray(item)) {
swtichArr(item)
} else {
result.push(item)
}
}
return result;
}
console.log(swtichArr(arr))
// reduce
let arrTwo = [[0, 1], [2, [7, 8], 3], [4, 5]];
function reduceFlatArr(arr) {
return arr.reduce((acc, cur) => Array.isArray(cur) ? acc.concat(reduceFlatArr(cur)) : acc.concat(cur), [])
}
console.log('reduceFlatArr', reduceFlatArr(arrTwo))