Array 常用方法

靜態方法

Array.isArray(obj);

檢測給定值是否為數組; 是則返回 true | 否則返回 false

console.log(Array.isArray([]));/* true */
console.log(Array.isArray(new Array(1,2)));/* true */
console.log(Array.isArray({}));/* false */

對操作數組本身進行修改的方法

  • pop 刪除并返回數組的最后一個元素
  • push 向末尾添加一個或多個元素,并返回新的長度
  • shift 刪除并返回數據的第一個元素
  • splice 刪除元素,并向數組添加元素
  • unshift 向開頭添加一個或多個元素,并返回新的長度
  • reverse 顛倒數組中元素的順序
  • sort 排序
  • fill 用指定值來填充數組

對操作數組本身 無影響

  • concat 連接兩個或多個數組,并返回結果
  • join 將數組的所有元素放入一個字符串中,元素按指定的分隔符進行連接
  • slice 從已有的數組返回選定的元素
  • map 返回調用處理方法后的數組值
  • forEach 遍歷數組所有值,并將值逐一傳給回調函數
  • filter 返回一個新數組,新數組中為符合條件的所有值
  • find 返回符合條件的第一個值
  • findIndex 返回符合條件第一個值得下標索引
  • indexOf 返回指定值在數組中首次出現的位置
  • includes 數組是否包含指定值
  • every 遍歷數組,檢測是否所有值都符合給定的函數判斷;全部符合返回true
  • some 遍歷數組,檢測是否有符合給定函數的判斷;有一個符合則返回true

對數組本身進行修改的方法

pop

刪除數組中的最后一個元素,并返回刪除的元素

let arr = [1,2,'a',{b:2}];
console.log(arr);
/* [ 1, 2, 'a', { b: 2 } ] */

console.log(arr.pop());
/* { b: 2 } */

console.log(arr);
/* [ 1, 2, 'a' ] */

push

向數組末尾添加一個或多個元素,并返回新的長度

let arr = [1,2];
let arrb = ['a','b'];
console.log(arr);
/* [ 1, 2 ] */

console.log(arr.push(...arrb));
/* length:4 */

console.log(arr);
/* [ 1, 2, 'a', 'b' ] */

arrb[0]='c';
console.log(arr);
/* [ 1, 2, 'a', 'b' ] */

console.log(arrb);
/* [ 'c', 'b' ] */

shift

刪除數組中的第一個元素,并返回刪除的元素

let arr = [{a:1},2,3];
console.log(arr.shift());
/* {a:1} */

console.log(arr);
/* [2,3] */

unshift

向數組的頭部增加一個或多個元素,并返回數組新的長度

let arr = [{a:1},2,3];
let arrb = ['c',{name:'dan'}];
console.log(arr.unshift(...arrb));
/* length:5 */

console.log(arr);
/* [ 'c', { name: 'dan' }, { a: 1 }, 2, 3 ] */

splice

向數組指定位置刪除指定個數元素 或 添加元素,并返回刪除元素的數組

  • index : 操作的起始位置
  • howmany : 刪除的個數 0:不刪除 | 不傳:刪除至數組末尾
  • newItem,*,newItems : 新增的元素
let arr = [1,2,3,4,5];
/*從數組第二位新增兩個元素,注:純新增必須設置第二個參數為 0*/
arr.splice(2,0,{a:1},234);
console.log(arr);
/* [ 1, 2, { a: 1 }, 234, 3, 4, 5 ] */

reverse

顛倒數組的前后順序,并返回顛倒排序后的數組

let arr = [1,2,3,4,5];
console.log(arr);
/* [ 1, 2, 3, 4, 5 ] */

arr.reverse();
console.log(arr);
/* [ 5, 4, 3, 2, 1 ] */

sort

對數組進行排序 | 無參時 按字符編碼順序升序排序 | 有參:如下

  • before 前一個元素
  • next 后一個元素

升序條件如下

  • 如果 before 小于 next,在排序后的數組中 before 應該出現在 next 之前,則返回一個小于 0 的值
  • 如果 before 等于 next,返回 0
  • 如果 before 大于 next,在排序后的數組中 before 應該出現在 next 之后,則返回一個大于 0 的值

降序條件如下

  • 如果 before 小于 next,在排序后的數組中 before 應該出現在 next 之后,則返回一個大于 0 的值
  • 如果 before 等于 next,返回 0
  • 如果 before 大于 next,在排序后的數組中 before 應該出現在 next 之前,則返回一個小于 0 的值
let arr = [{name:'a',age:23},{name:'g',age:32},{name:'d',age:2},{name:'z',age:99},{name:'j',age:13},{name:'e',age:78},{name:'p',age:34},{name:'e',age:33}];
function sortBy(attr,ascORdesc = 'asc'){
    let ascORdescFlag = (ascORdesc== 'asc'?1:-1);
    return function sort(before,next){
        before = before[attr];
        next = next[attr];
        if(before<next){
            return -1*ascORdescFlag;
        }
        if(before>next){
            return 1*ascORdescFlag;
        }
        return 0;
    };
}
arr.sort(sortBy('age',22));
console.log(arr);
/*
[ { name: 'z', age: 99 },
 { name: 'e', age: 78 },
 { name: 'p', age: 34 },
 { name: 'e', age: 33 },
 { name: 'g', age: 32 },
 { name: 'a', age: 23 },
 { name: 'j', age: 13 },
 { name: 'd', age: 2 } ]
*/

arr.sort(sortBy('name'));
console.log(arr);
/*
[ { name: 'a', age: 23 },
 { name: 'd', age: 2 },
 { name: 'e', age: 78 },
 { name: 'e', age: 33 },
 { name: 'g', age: 32 },
 { name: 'j', age: 13 },
 { name: 'p', age: 34 },
 { name: 'z', age: 99 } ]
*/

fill

將指定的值 替換到 數組中的指定位置

  • value: 必填|填充的值
  • start: 可選|填充的起始位置
  • end: 可選|填充的結束位置
let arr = ['d','b','c',1,3];
arr.fill('hello',3,5);
console.log(arr);
/* [ 'd', 'b', 'c', 'hello', 'hello' ] */

arr.fill('world',2);
console.log(arr);
/* [ 'd', 'b', 'world', 'world', 'world' ] */

arr.fill('hello world');
console.log(arr);
/* 
[ 'hello world',
 'hello world',
 'hello world',
 'hello world',
 'hello world' ]
*/

對數組本身無影響的方法

concat

連接兩個或多個數組

let arr = [1,{age:28},3],arrb=['a','b'],arrc = [];
arrc = arrc.concat(arr,arrb);
console.log(arrc);
/* [ 1, { age: 28 }, 3, 'a', 'b' ] */

arr[0] = 'hello world';
arr[1].age = 18;
console.log(arrc);
/*
注意: 原數組中,引用類型的值修改會造成返回的新數組值修改 [引用的為同一地址]
[ 1, { age: 18 }, 3, 'a', 'b' ] 
*/

join

將數組中得所有元素連接成字符串

  • separator 連接各元素的分隔符;若不指定,默認為逗號連接
let arr = [-1,'a',['b','c',['d','e']],'123a'];
console.log(arr.join());
/* -1,a,b,c,d,e,123a */

console.log(arr.join(''));
/* -1ab,c,d,e123a */

/*打平嵌套數組
* 注:處理后,如元素組中的元素 為String類型的數字,處理后為Number類型
*/
function unwind(array){
    return arr.join(',').split(',').map((item)=>{return Number(item)?Number(item):item});
}
console.log(unwind(arr));
/* [ -1, 'a', 'b', 'c', 'd', 'e', 123 ] */

slice

返回數組中指定的元素

  • start | [起始下標] -1 為數組最后的元素
  • end | [結束下標]
let arr = [1,'b',{c:'hello'},'d'];
let arrb = arr.slice(-1),arrc = arr.slice();
console.log(arrb);
/* [ 'd' ] */

console.log(arrc);
/* [ 1, 'b', { c: 'hello' }, 'd' ] */

map

返回一個新數組,新元素為 原元素調用函數處理后的值

  • currentValue: 當前值[原數組] | 必須
  • index: 當前值的下標索引 | 可選
  • arr: 原數組對象 | 可選
let arr = [1,3,'4','b',{c:'hello'}];
let arrb = arr.map(function(item){
    return item*2;
});
console.log(arr);
/* [ 1, 3, '4', 'b', { c: 'hello' } ] */

console.log(arrb);
/* [ 2, 6, 8, NaN, NaN ] */

forEach

遍歷數組的每個元素,并將元素傳遞給回調函數

  • currentValue: 當前值[原數組] | 必須
  • index: 當前值的下標索引 | 可選
  • arr: 原數組對象 | 可選
/*
*數組去重
*此方法僅可用于基礎類型的值 去重,引用類型無法去除
*/
function uniq(array){
    let returnArr = [],tmpMap = {};
    array.forEach((item)=>{
        if(!tmpMap[item]){
            returnArr.push(item);
            tmpMap[item] = 1;
        }
    });
    return returnArr;
}
let testArr = [1,1,2,2,2,3,3,3,3,'a','a','b','c',{d:'123'},{d:'456'}];
console.log(uniq(testArr));
/* [ 1, 2, 3, 'a', 'b', 'c', { d: '123' } ] */

filter

返回一個新數組,新數組中的元素為符合判斷條件的元素

  • currentValue: 當前值[原數組] | 必須
  • index: 當前值的下標索引 | 可選
  • arr: 原數組對象 | 可選
/* 數組去重 
*此方法僅可用于基礎類型的值 去重,引用類型無法去除
*/
let testArr = [1,1,2,2,2,3,3,3,3,'a','a','b','c'];
let reArr = testArr.filter((item,i,arr)=>{
    return arr.indexOf(item)===i;
});
console.log(reArr);
/* [ 1, 2, 3, 'a', 'b', 'c' ] */

find

返回符合條件的 第一個值

  • currentValue: 當前值[原數組] | 必須
  • index: 當前值的下標索引 | 可選
  • arr: 原數組對象 | 可選
let testArr = [{age:11},{age:22},{age:33}];
let reArr = testArr.find((item,i,arr)=>{
    return item.age>15;
});
console.log(reArr);
/* { age: 22 } */

findIndex

返回符合條件的 第一個值的下標索引

  • currentValue: 當前值[原數組] | 必須
  • index: 當前值的下標索引 | 可選
  • arr: 原數組對象 | 可選
let testArr = [{age:11},{age:22},{age:33}];
let reArr = testArr.find((item,i,arr)=>{
    return item.age>15;
});
console.log(reArr);
/* 1 */

indexOf

返回指定元素值的第一個下標索引

  • item | 待檢索的值
  • start | 檢索的起始位置
/* 數組去重 
*此方法僅可用于基礎類型的值 去重,引用類型無法去除
*/
let testArr = [1,1,2,2,2,3,3,3,3,'a','a','b','c'];
let reArr = testArr.filter((item,i,arr)=>{
    return arr.indexOf(item)===i;
});
console.log(reArr);
/* [ 1, 2, 3, 'a', 'b', 'c' ] */

lastIndexOf

返回指定元素值的第一個下標索引

  • item | 待檢索的值
let testArr = [1,1,2,2,2,3,3,3,3,'a','a','b','c'];
console.log(testArr.lastIndexOf('a'));
/* 10 */

includes

檢測數組中是否包含指定元素,有則true | 否則false

  • item | 待檢測的值
  • start | 檢索的起始位置
let testArr = [11,22,33];
console.log(testArr.includes(22));
/* true */

every

檢測是否數組中的元素都符合指定的條件,都符合則返回true | 一旦有一個不符合返回 false

  • currentValue: 當前值[原數組] | 必須
  • index: 當前值的下標索引 | 可選
  • arr: 原數組對象 | 可選
let testArr = [{age:11},{age:22},{age:33}];
let reArr = testArr.every((item,i,arr)=>{
    return item.age>15;
});
console.log(reArr);
/* false */

some

檢測數組中是否有一個滿足條件的元素,只要有一個則返回true | 一個都沒有則返回 false

  • currentValue: 當前值[原數組] | 必須
  • index: 當前值的下標索引 | 可選
  • arr: 原數組對象 | 可選
let testArr = [{age:11},{age:22},{age:33}];
let reArr = testArr.some((item,i,arr)=>{
    return item.age>15;
});
console.log(reArr);
/* true */

reduce

將數組中的每個值從左到右開始縮減,經函數處理后,最終返回一個值

  • function
    • total 初始值, 或者計算結束后的返回值 | 必須
    • currentValue: 當前值[原數組] | 必須
    • index: 當前值的下標索引 | 可選
    • arr: 原數組對象 | 可選
  • 可選。傳遞給函數的初始值
/*打平嵌套數組
* 使用條件僅為 待打平的數組為 二維數組
*/
let testArr = [1,['a','c'],3];
console.log(testArr.reduce((r,item)=>r.concat(item),[]));
/* [ 1, 'a', 'c', 3 ] */
/* 注:不提供默認值時:初始的默認值為 首位元素的值*/

reduceRight

將數組中的每個值從右到左開始縮減,經函數處理后,最終返回一個值

  • function
    • total 初始值, 或者計算結束后的返回值 | 必須
    • currentValue: 當前值[原數組] | 必須
    • index: 當前值的下標索引 | 可選
    • arr: 原數組對象 | 可選
  • 可選。傳遞給函數的初始值
let testArr = [1,2,3,4,5,6];
console.log(testArr.reduce((total,item)=>{
    return total-item;
}));
/* 注:不提供默認值時:初始的默認值為 末位元素的值*/
/* -19 */
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內容

  • 創建數組 通過一個數字參數,創建指定長度的數組 通過一個非數字參數 或 多個參數創建一個擁有元素的數組 通過直接量...
    歐陽小龍蝦閱讀 238評論 0 0
  • 在日常編程過程中,我們總要對數組進行操作。然而使用最原始的js代碼效率很低,而ES6提供了很多方法,極大的提高了我...
    小焲閱讀 1,669評論 1 0
  • 由于最近都在freecodecamp上刷代碼,運用了很多JavaScript數組的方法,因此做了一份關于JavaS...
    2bc5f46e925b閱讀 1,992評論 0 16
  • 創建數組 arr.length--- title: js正則表達式categories: javascriptda...
    angelwgh閱讀 1,401評論 0 2
  • Javascript有很多數組的方法,有的人有W3C的API,還可以去MDN上去找,但是我覺得API上說的不全,M...
    頑皮的雪狐七七閱讀 4,140評論 0 6