JS數(shù)組方法速查

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
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末炫隶,一起剝皮案震驚了整個(gè)濱河市淋叶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伪阶,老刑警劉巖煞檩,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異栅贴,居然都是意外死亡斟湃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門檐薯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桐早,“玉大人,你說我怎么就攤上這事厨剪『逶停” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵祷膳,是天一觀的道長陶衅。 經(jīng)常有香客問我,道長直晨,這世上最難降的妖魔是什么搀军? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任膨俐,我火速辦了婚禮,結(jié)果婚禮上罩句,老公的妹妹穿的比我還像新娘焚刺。我一直安慰自己,他們只是感情好门烂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坡脐,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天房揭,我揣著相機(jī)與錄音,去河邊找鬼捅暴。 笑死浅役,一個(gè)胖子當(dāng)著我的面吹牛伶唯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乳幸,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼粹断!你這毒婦竟也來了符欠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤瓶埋,失蹤者是張志新(化名)和其女友劉穎希柿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體养筒,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡曾撤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晕粪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挤悉。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖巫湘,靈堂內(nèi)的尸體忽然破棺而出装悲,到底是詐尸還是另有隱情昏鹃,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布诀诊,位于F島的核電站洞渤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏属瓣。R本人自食惡果不足惜载迄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奠涌。 院中可真熱鬧宪巨,春花似錦磷杏、人聲如沸溜畅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慈格。三九已至,卻和暖如春遥金,著一層夾襖步出監(jiān)牢的瞬間浴捆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工稿械, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留选泻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓美莫,卻偏偏與公主長得像页眯,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子厢呵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載:在開發(fā)中襟铭,數(shù)組的使用場(chǎng)景非常多碌奉,平日中也涉及到很多數(shù)組的api/相關(guān)操作,一直也沒有對(duì)這塊內(nèi)容進(jìn)行一塊整理總...
    七色煙火閱讀 3,219評(píng)論 0 3
  • ECMAScript為操作已經(jīng)包含在數(shù)組中的項(xiàng)提供了很多方法寒砖。這里本人總結(jié)一下自己對(duì)這些方法的理解赐劣,如此之多的方法...
    強(qiáng)哥科技興閱讀 547評(píng)論 0 0
  • 數(shù)組是值的有序集合。每個(gè)值叫做一個(gè)元素哩都,而每個(gè)元素在數(shù)組中有一個(gè)位置,以數(shù)字表示茅逮,稱為索引判哥。 JavaScript...
    劼哥stone閱讀 1,130評(píng)論 6 20
  • 1. 母親沒笑過碉考,因?yàn)槲?0歲了,還沒結(jié)婚侯谁。 過完年,讓她一起來北京住幾天热芹,她第一次坐火車,什么都不懂伊脓,我拉著她的...
    毛毛小藍(lán)閱讀 180評(píng)論 0 0
  • 你有沒有發(fā)現(xiàn)一個(gè)秘密剖淀? 現(xiàn)在的時(shí)間過的感覺越來越快,你六點(diǎn)多鐘起床翻诉,穿個(gè)衣服,吃個(gè)早餐(甚至有時(shí)還沒時(shí)間吃)然后到...
    小白cai閱讀 95評(píng)論 0 0