1.數(shù)組去重
let arrs = [1,2,2,3,3,6,5,5];
// ES6
[...new Set(arr)] // [1,2,3,6,5]
// 此方法也能去除數(shù)組中重復(fù)的項(xiàng):[...new Set('ababbc')].join('') // abc
// 其他方法
function uniq(array){
let temp = [];
let l = array.length;
for(let i = 0; i < l; i++) {
for(let j = i + 1; j < l; j++){
if (array[i] === array[j]){
i++;
j = i;
}
}
temp.push(array[i]);
}
return temp;
}
console.log(uniq(arrs)); // [1,2,3,6,5]
2.數(shù)組合并
let arr1 = [1,2,3]
let arr2 = [4,5,6]
// ES6
[...arr1, ...arr2] // [1, 2, 3, 4, 5, 6]
// 方法2:concat方法(掛載Array原型鏈上)
let c = a.concat(b);
console.log(c); // [1, 2, 3, 4, 5, 6]
console.log(a); // [1, 2, 3] 不改變本身
// 備注:看似concat似乎是 數(shù)組對(duì)象的深拷貝侠讯,其實(shí),concat 只是對(duì)數(shù)組的第一層進(jìn)行深拷貝
// 方法3:apply方法
Array.prototype.push.apply(a, b);
console.log(a); // [1, 2, 3, 4, 5, 6] 改變?cè)繕?biāo)數(shù)組
console.log(b); // [4, 5, 6]
3.數(shù)組排序(sort)
let objArr = [
{name: 'test1', age: 20},
{name: 'test1', age: 22},
{name: 'test1', age: 21}
]
// 第一參數(shù)a迄损, 第二參數(shù)b ---> a-b升序(從小到大);b-a降序(從大到型獭)骗爆,原理就是 兩數(shù)計(jì)算碉哑,如果返回的是負(fù)數(shù),就保留前者(我可能說的不對(duì)鸵熟,歡迎糾正)
objArr.sort((a, b) => {
return a.age - b.age
})
// 結(jié)果會(huì)按照年齡從小到大的順序排列
4.多維數(shù)組轉(zhuǎn)一維數(shù)組(flat)
let arr = [1, [2], [[3], 4], 5];
// ES6 數(shù)組的flat()
arr.flat() // [1, 2, Array(1), 4, 5] 如果這樣寫的話只能展開二維數(shù)組副编,但是可以加參數(shù)Infinity,就是能展開多維數(shù)組
arr.flat(Infinity) // [1, 2, 3, 4, 5] 注意如果原數(shù)組有空位流强,flat()方法會(huì)跳過空位
// 其他方法
const deepFlatten = arr => [].concat(...arr.map(v => (Array.isArray(v) ? deepFlatten(v) : v)));
deepFlatten(arr); // [1,2,3,4,5]
// 執(zhí)行效率驗(yàn)證(拓展)
// let start = new Date().getTime();
// console.log('reduceDimension: ', deepFlatten([1, [2], [[3], 4], 5]);
// console.log('耗時(shí): ', new Date().getTime() - start); // *ms
// ES6 數(shù)組的flatMap() 方法大家可以自行查閱一下痹届,拓展下自己的知識(shí)面
5.過濾數(shù)組(filter)
let json = [
{ id: 1, name: 'john', age: 24 },
{ id: 2, name: 'zkp', age: 21 },
{ id: 3, name: 'mike', age: 50 }
];
// ES6
json.filter( item => item.age > 22) // [{id: 1, name: 'john', age: 24}, { id: 3, name: 'mike', age: 50 }]
// ES5
6.判斷數(shù)組中的項(xiàng)是否滿足于某個(gè)條件(some,every)
let arr = [4, 2, 3]
// ES6 some方法(有符合)
arr.some( item => item > 1) // true
arr.some( item => item > 3) // true
// ES5 every(全符合)
arr.every(item => item > 1) // true
arr.every(item => item > 3) // false
// 注意:上面兩個(gè)有不同哦打月,一個(gè)是有符合的判定队腐,一個(gè)是全符合的判定
7.操作數(shù)組中的每一項(xiàng),并使其按照一定的邏輯返回(map)
var potatos = [
{ id: '1001', weight: 50 },
{ id: '1002', weight: 80 },
{ id: '1003', weight: 120 },
{ id: '1004', weight: 40 }
]
// ES6寫法
const fn = (arr, key) => arr.map(arr => arr[key])
fn(potatos, 'id') // ["1001", "1002", "1003", "1004"]
fn(potatos, 'weight') // [50, 80, 120, 40]
8.其他常用的ES6 Array方法
// forEach() 遍歷數(shù)組
// pop() 刪除數(shù)組中最后一個(gè)元素奏篙,并返回該元素的值柴淘。此方法更改數(shù)組的長度
// shift() 刪除數(shù)組中第一個(gè)元素,并返回該元素的值秘通。此方法更改數(shù)組的長度
// push() 將一個(gè)或多個(gè)元素添加到數(shù)組的末尾为严,并返回該數(shù)組的新長度
// unshift() 將一個(gè)或多個(gè)元素添加到數(shù)組的開頭,并返回該數(shù)組的新長度(該方法修改原有數(shù)組)
// ??Array.prototype.filter() 創(chuàng)建一個(gè)新數(shù)組, 其包含通過所提供函數(shù)實(shí)現(xiàn)的測(cè)試的所有元素肺稀,不會(huì)改變?cè)兄档诠桑绻麤]符合的返回[]
let arr = [1, 2, 3]
arr.filter( x => x > 1) // [2, 3]
// Array.prototype.join() 將一個(gè)數(shù)組(或一個(gè)類數(shù)組對(duì)象)的所有元素連接成一個(gè)字符串并返回這個(gè)字符串
['Fire', 'Air', 'Water'].join() // "Fire,Air,Water"
// Array.prototype.slice() 取出任意元素, | 參數(shù)一:從哪開始,參數(shù)二(可選)結(jié)束位置话原,不選的話 就節(jié)選到最后了
[1, 2, 3].slice(0, 1) // [1]
// Array.prototype.splice() 刪除任意元素夕吻,操作任意元素 | 參數(shù)一:從哪開始 | 參數(shù)二:操作元素的個(gè)數(shù) | 參數(shù)三:插入元素的值...(可以寫多個(gè)參數(shù)三)
[1, 2, 3].splice(0, 1) // 刪除 [2, 3]
// Array.prototype.includes() 用來判斷一個(gè)數(shù)組是否包含一個(gè)指定的值诲锹,根據(jù)情況,如果包含則返回 true梭冠,否則返回false。
[1, 2, 3].includes(1) // true
// Array.prototype.reverse() 顛倒數(shù)組
[1, 2, 3].reverse() // [3, 2, 1]
9.獲得數(shù)組最大最小值
// 使用 Math 中的 max/min 方法
let arr = [22,13,6,55,30];
// ES6
Math.max(...arr); // 55
Math.min(...arr); // 6
// ES5
Math.max.apply(null, arr); // 55
Math.min.apply(null, arr); // 6
10.獲取數(shù)組交集
// ES6 寫法
const similarity = (arr1, arr2) => arr1.filter(v => arr2.includes(v));
similarity([1, 2, 3], [1, 2, 4]); // [1,2]
// ES5 寫法
// function similarity(arr1, arr2) {
// return arr2.filter(function(v) {
// return arr1.includes(v)
// })
// }
11.數(shù)組對(duì)象去重
let arr = [
{id: 1, name: 'Jhon1'},
{id: 2, name: 'sss'},
{id: 3, name: 'Jhon2'},
{id: 4, name: 'Jhon3'}
]
// ES6
const uniqueElementsBy = (arr, fn) =>arr.reduce((acc, v) => {if (!acc.some(x => fn(v, x))) acc.push(v);return acc;}, []);
// 下面的示例表示改备,去重依據(jù)是 id 控漠,就是 id一樣的,只留下一個(gè)
uniqueElementsBy(arr, (a, b) => a.id === b.id) // [{id: 1, name: 'Jhon1'}, {id: 2, name: 'sss'}]
12.數(shù)組亂序
function shuffle(arr) {
let array = arr
let index = array.length
while (index) {
index -= 1
let randomInedx = Math.floor(Math.random() * index)
let middleware = array[index]
array[index] = array[randomInedx]
array[randomInedx] = middleware
}
return array
}
let arr = [1,2,3,4,5]
shuffle(arr) // [3, 4, 2, 5, 1] 結(jié)果不定
13.檢查數(shù)組中某元素出現(xiàn)的次數(shù)
function countOccurrences(arr, value) {
return arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0);
}
let arr = [1,2,3,4,1,2,4]
countOccurrences(arr, 1) // 2
14.檢查數(shù)組中的所有元素是否相等
const allEqual = arr => arr.every(val => val === arr[0]);
// 示例
allEqual([1, 2, 3, 4, 5, 6]); // false
allEqual([1, 1, 1, 1]); // true
15.數(shù)組對(duì)象悬钳,求某一列屬性的總和
var potatos = [
{ id: '1001', weight: 50 },
{ id: '1002', weight: 80 },
{ id: '1003', weight: 120 },
{ id: '1004', weight: 40 }
]
// ES6寫法
const fn = (arr, key) => arr.reduce((sum, p) => { return p[key] + sum },0)
fn(potatos, 'weight') // 290
fn(potatos, 'id') // "10041003100210010" 字符串相加就是這個(gè)結(jié)果盐捷,如果有各自的需求,可以自己加上
16.分割數(shù)組默勾,并操作每一項(xiàng)數(shù)組(函數(shù))
/**
* 數(shù)組分隔方法碉渡,并且可以傳入一個(gè)處理函數(shù),用來分隔之前處理數(shù)組的每一項(xiàng)
*
* @category Array
* @param {Array} array 需要處理的數(shù)組
* @param {number} [size = 1] 每個(gè)數(shù)組區(qū)塊的長度
* @param {Function} [fn = item => item] 函數(shù)
* @returns {Array} 返回一個(gè)包含拆分區(qū)塊的新數(shù)組(相當(dāng)于一個(gè)二維數(shù)組)母剥。
* @example
*
* chunk(['a', 'b', 'c', 'd'], 2)
* // => [['a', 'b'], ['c', 'd']]
*
* chunk(['a', 'b', 'c', 'd'], 3)
* // => [['a', 'b', 'c'], ['d']]
*
* chunk([1, 2, 3, 4], 3, item => item * 2)
* // => [[2, 4, 6], [8]]
*/
function chunk(array, size = 1, fn = item => item) {
array = array.map(fn)
size = Math.max(size, 0) // 這一句就很妙滞诺,當(dāng)傳入值小于0的時(shí)候,置為0环疼,大于0的時(shí)候习霹,不寫,但不知道性能怎么樣
const length = array == null ? 0 : array.length
if (!length || size < 1) {
return []
}
let index = 0
let resIndex = 0
const result = new Array(Math.ceil(length / size))
while (index < length) {
result[resIndex++] = array.slice(index, (index += size))
}
return result
}