如何实现数组的扁平化,一道题引起对javaScript基础思考,今日现总结下数组的基本方法, 搬运不易,多多点赞,感谢!java
定义数组: const arr = [1, 2, 3, 4, 5, 6]算法
用于测试构造函数的prototype属性是否出如今对象的原型链中的任何位置数组
console.log(arr instanceof Array)
# 输出: true
复制代码
用于肯定传递的值是不是一个 Arraybash
console.log(Array.isArray(arr));
# true
Array.isArray(Array.prototype)
# true Array.prototype也是个数组
复制代码
Polyfillapp
if (!Array.isArray) {
Array.isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}
复制代码
console.log(Object.prototype.toString.call(arr));
# [object Array]
复制代码
arr.every(callback[, thisArg])
ui
示例:
arr.every(function(item, index, array){
return item < 4
})
# 输出 false
# 此时arr = []
arr.every(function(item, index, array){
return item > 4
})
# 输出 true
复制代码
Polyfillthis
if (!Array.prototype.every) {
Array.prototype.every = function(fun /*, thisArg */) {
'use strict';
if (this === void 0 || this === null) {
throw new TypeError();
}
var t = Object(this);
var len = t.length >>> 0;
if (typeof fun !== 'function') {
throw new TypeError();
}
var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
for (var i = 0; i < len; i++) {
if (i in t && !fun.call(thisArg, t[i], i, t))
return false;
}
return true;
};
}
复制代码
arr.some(callback(element[, index[, array]])[, thisArg])
示例:
function checkAvailability(arr, val) {
return arr.some(function(arrVal) {
return val === arrVal;
});
}
checkAvailability(arr, 3)
# 输出true
# 此时arr = []
arr.some(function(item, index, array){
return item > 4
})
# 输出 false
复制代码
Polyfill
if (!Array.prototype.some) {
Array.prototype.some = function(fun/*, thisArg*/) {
'use strict';
if (this == null) {
throw new TypeError('Array.prototype.some called on null or undefined');
}
if (typeof fun !== 'function') {
throw new TypeError();
}
var t = Object(this);
var len = t.length >>> 0;
var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
for (var i = 0; i < len; i++) {
if (i in t && fun.call(thisArg, t[i], i, t)) {
return true;
}
}
return false;
};
}
复制代码
arr.forEach(callback[, thisArg]), 返回值:undefined
示例:
const newArr = []
arr.forEach(function(item, index, array){
newArr.push(item)
})
# 输出newArr [1,2,3,4,5,6]
复制代码
arr.filter(callback(element[, index[, array]])[, thisArg])
示例:
const newArr = arr.filter(function(item, index){
return item > 4
})
# 输出 [5,6]
复制代码
arr.map(function callback(currentValue[, index[, array]]) { }[, thisArg])
示例:
const newArr = arr.map(function(item, index, array){
let obj = {}
obj[item] = item
return obj
})
# 输出[ { '1': 1 },{ '2': 2 },{ '3': 3 },{ '4': 4 },{ '5': 5 },{ '6': 6 } ]
复制代码
arr.find(callback[, thisArg])
示例
const newArr = arr.find(function(item, index, array){
return item === 5
})
# 输出 5
复制代码
arr.findIndex(callback[, thisArg])
示例
const index = arr.findIndex(function(item, index, array){
return item === 2
})
# 输出 1
复制代码
arr.indexOf(searchElement)
arr.indexOf(searchElement[, fromIndex = 0])
示例
const index = arr.indexOf(2)
# 输1
复制代码
arr.indexOf(searchElement)
arr.indexOf(searchElement[, fromIndex = 0])
示例
# arr = [1,2,3,4,5,2,2]
const index = arr.lastIndexOf(2)
# 输出6
复制代码
arr.includes(valueToFind[, fromIndex])
示例
const bool = arr.includes(2) # true
const bool = arr.includes(2, 4) # false
const bool = arr.includes(2, -5) # true 从index 1开始查找
const bool = arr.includes(2, -2) # false 从index 4开始查找
const bool = arr.includes(2, -1) # false
const bool = arr.includes(12) # false
[1, 2, NaN].includes(NaN) # true
复制代码
arr.push(element1, ..., elementN)
示例
const length = arr.push(2)
# 输出length = 7
# 原数组变成[ 1, 2, 3, 4, 5, 6, 2 ]
复制代码
arr.pop()
示例
const lastVal = arr.pop()
# 输出lastVal = 6
# 原数组变成[ 1, 2, 3, 4, 5 ]
复制代码
arr.unshift(element1, ..., elementN)
const length = arr.unshift(11)
# 输出length = 7
# 原数组变成[ 11, 1, 2, 3, 4, 5, 6 ]
复制代码
arr.shift()
示例
const lastVal = arr.shift()
# 输出lastVal = 1
# 原数组变成 [ 2, 3, 4, 5, 6 ]
复制代码
arr.slice() [0, end]
arr.slice(begin) [begin, end]
arr.slice(begin, end) [begin, end)
示例
const newArr = arr.slice()
# 输出 [ 1, 2, 3, 4, 5, 6 ]
const newArr = arr.slice(1)
# 输出 [ 2, 3, 4, 5, 6 ]
const newArr = arr.slice(3, 5)
# 输出 [ 4, 5 ]
const newArr = arr.slice(-2)
# 输出 [ 5, 6 ]
const newArr = arr.slice(-2, 4)
# 输出 [ 5, 6 ]
const index = arr.slice(-2, -7)
# 输出 []
复制代码
array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
示例
const spliceArr = arr.splice(1, 0, 'bk')
# 输出原数组[ 1, 'bk', 2, 3, 4, 5, 6 ] spliceArr[]
const spliceArr = arr.splice(1, 1, 'bk', 'growth')
# 输出原数组[ 1, 'bk', 'growth', 3, 4, 5, 6 ] spliceArr[2]
const spliceArr = arr.splice(1, 1)
# 输出原数组[ 1, 3, 4, 5, 6 ] spliceArr[2]
const spliceArr = arr.splice(-2, 1)
# 输出原数组[ 1, 3, 4, 6 ] spliceArr[5]
const spliceArr = arr.splice(2)
# 输出原数组[ 1, 2 ] spliceArr [ 3, 4, 5, 6 ]
const spliceArr = arr.splice(2, 100)
# 输出原数组[ 1, 2 ] spliceArr [ 3, 4, 5, 6 ]
const spliceArr = arr.splice(2, -2)
# 输出原数组[ 1, 2, 3, 4, 5, 6 ] spliceArr[]
复制代码
old_array.concat(value1[, value2[, ...[, valueN]]])
示例
链接两个数组
const arr1 = [1, 2, 3]
const arr2 = [4, 5, 6]
arr1.concat(arr2)
# 输出 [1, 2, 3, 4, 5, 6]
链接三个数组
const arr1 = [1, 2, 3]
const arr2 = [4, 5, 6]
const arr2 = [7, 8, 9]
arr1.concat(arr2, arr3)
# 输出 [1, 2, 3, 4, 5, 6, 7, 8, 9]
值链接三个数组
const arr1 = [1, 2, 3]
const arr2 = 4
const arr2 = [7, 8, 9]
arr1.concat(arr2, arr3)
# 输出 [1, 2, 3, 4, 7, 8, 9]
复制代码
arr.fill(value[, start[, end]])
arr.fill(value, start = 0, end = this.length)
示例
arr.fill(4)
# 输出 [4,4,4,4,4,4]
arr.fill(4, 1)
# 输出 [1,4,4,4,4,4]
arr.fill(4, 1, 1)
# 输出 [1, 2, 3, 4, 5, 6]
arr.fill(4, 7, 7)
# 输出 [1, 2, 3, 4, 5, 6]
arr.fill(4, -4, -3)
# 输出 [1, 2, 4, 4, 5, 6]
arr.fill(4, NaN, NaN)
# 输出 [1, 2, 4, 4, 5, 6]
Array(3).fill(4)
# 输出 [4, 4, 4]
[].fill.call({ length: 3 }, 4)
# 输出{0: 4, 1: 4, 2: 4, length: 3}
var arr = Array(3).fill({})
arr[0].hi = "hi"
# 输出[{ hi: "hi" }, { hi: "hi" }, { hi: "hi" }]
复制代码
arr.copyWithin(target[, start[, end]])
arr.copyWithin(target, start = 0, end = this.length)
示例
arr.copyWithin(0, 3)
# 输出 [4, 5, 6, 4, 5, 6]
arr.copyWithin(-2)
# 输出 [1, 2, 3, 4, 1, 2]
arr.copyWithin(0, 3, 4)
# 输出 [4, 2, 3, 4, 5, 6]
arr.copyWithin(-2, -3, -1)
#输出 [1, 2, 3, 4, 4, 5]
[].copyWithin.call({length: 5, 3: 1}, 0, 3)
# 输出 {0: 1, 3: 1, length: 5}
复制代码
var newArray = arr.flat(depth)
示例
const arr1 = [1, 2, [3, 4]];
arr1.flat();
# [1, 2, 3, 4]
const arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
# [1, 2, 3, 4, [5, 6]]
const arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2);
# [1, 2, 3, 4, 5, 6]
# 使用 Infinity 做为深度,展开任意深度的嵌套数组
arr3.flat(Infinity);
# [1, 2, 3, 4, 5, 6]
const arr4 = [1,2,3,[4,,5]]
arr4.flat()
# [1, 2, 3, 4, 5]
复制代码
arr.reduce(callback[, initialValue])
arr.reduce(function(Accumulator, CurrentValue, currentIndex, SourceArray), InitialValue)
示例
# 求和
const arr = [0,1,2,3,4]
arr.reduce(function(accumulator, currentValue){
return accumulator + currentValue
})
# 10
复制代码
看下执行过程
# 二维数组转为一位数组
const arr = [0,[1,2],[3,4]]
arr.reduce(function(accumulator, currentValue){
return accumulator.concat(currentValue)
}, [])
# 输出[0, 1, 2, 3, 4]
# 假如如今是多维数组转为一位数组呢
const arr2 = [0,[1,2],[3,4, [5,6,[7,8]]]]
const flatArr = (arr) => {
return arr.reduce(function(accumulator, currentValue){
return accumulator.concat(Array.isArray(currentValue)? flatArr(currentValue): currentValue)
}, [])
}
flatArr(arr2)
# 输出 [0, 1, 2, 3, 4, 5, 6, 7, 8]
# 计算数组中每一个元素出现的次数
const arr3 = [1,1,2,3,4,2, 2, 3]
var counted = arr3.reduce(function (allArr, num) {
if (num in allArr) {
allArr[num]++;
}
else {
allArr[num] = 1;
}
return allArr;
}, {})
# 输出 {1: 2, 2: 3, 3: 2, 4: 1}
复制代码
arr.sort([compareFunction])
示例
const arr = [1,9,2,1,3,5,12,3]
arr.sort(function(a,b){
return a - b
})
# 输出 [1, 1, 2, 3, 3, 5, 9, 12]
复制代码
arr.reverse()
示例
arr.reverse()
# 输出 [ 6, 5, 4, 3, 2, 1 ]
复制代码
arr.entries()
示例
const newIterator = arr.entries()
newIterator.next()
# 输出
entries输出: Array Iterator {}
__proto__: Array Iterator
next: ƒ next()
Symbol(Symbol.toStringTag): "Array Iterator"
__proto__: Object
next输出: {value: Array(2), done: false}
done: false
value: (2) [0, 1]
__proto__: Object
for (let e of newIterator) {
console.log(e);
}
# 输出[0, 1]、[1, 2]、[2, 3]、[3, 4]、[4, 5]、[5, 6]
复制代码
arr.keys()
示例
var arr = ["a", , "c"];
var sparseKeys = Object.keys(arr);
var denseKeys = [...arr.keys()];
console.log(sparseKeys); // ['0', '2']
console.log(denseKeys); // [0, 1, 2]
复制代码
arr.values()
let arr = ['w', 'y', 'k', 'o', 'p'];
let eArr = arr.values();
# 您的浏览器必须支持 for..of 循环
# 以及 let —— 将变量做用域限定在 for 循环中
for (let letter of eArr) {
console.log(letter);
}
# 输出 w y k o p
另外一种迭代方式
eArr.next().value
# w
复制代码