如何實現數組的扁平化,一道題引起對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
複製代碼