JavaScript對數(shù)組的操作


本篇文章純屬于個人的學習總結(jié)五续,如果文章中出現(xiàn)錯誤或不嚴謹?shù)牡胤饺髅簦M蠹夷軌蛑赋觯x謝疙驾!

數(shù)組檢測的方法

  • instanceof
    主要是檢測變量的原型鏈是否指向Array構(gòu)造函數(shù)的prototype原型上凶伙,但instanceof不能保證返回的結(jié)果一定正確,因為只要在原型鏈上都會返回true它碎。arr instanceof Object 也會返回true函荣。
let arr = [1, 2, 3];
arr instanceof Array; //true
  • contructor
var arr = [];
arr.constructor === Array  return true
但constructor可以被重寫铣卡,不能保證一定是數(shù)組
    var str = "abc";
    str.constructor = Array;
    str.constructor === Array //return true
很顯然,str不是數(shù)組
  • Array.isArray()

ES5在Array上新增了檢測數(shù)組的方法偏竟,存在兼容性問題煮落。

  • Object.prototype.toString.call()

可以確保方法能檢測一定是數(shù)組。

var arr = [1, 3, 6];
Object.prototype.toString.call(str) === "[object Array]"; //rturn true
  • 總結(jié):

由于Array.isArray()是封裝在瀏覽器中踊谋,運行效率比較高蝉仇,所以當要真正檢測變量類型時,先會檢測瀏覽器是否支持Array.isArray()殖蚕,之后再用Object.prototype.call()方法轿衔。代碼應該如下:

// 判斷元素是不是數(shù)組
    let arr4 = "12, 45";

    function isArray(value) {
      if (typeof Array.isArray === "function") {
        return Array.isArray(value);
      } else {
        return Object.prototype.toString.call(value) === "[object Array]";
      }
    }
    console.log(isArray(arr4));

數(shù)組對象方法

創(chuàng)建
let a = new Array(); 等價于 let a = [];
實例方法
  • push()

在數(shù)組最后添加,返回新數(shù)組的長度睦疫,改變原數(shù)組

  • pop()

刪除數(shù)組最后一項害驹,返回刪除的元素,改變原數(shù)組

  • shift()

刪除數(shù)組中第一個元素蛤育,返回刪除的元素宛官,改變原數(shù)組

  • unshift()

在數(shù)組最前面添加,返回新數(shù)組的長度瓦糕,改變原數(shù)組

  • fill(val, start, end)

用一個固定的值替換數(shù)組中的元素底洗,返回新數(shù)組,改變原數(shù)組

  • reverse()

前后調(diào)換元素位置咕娄,返回新數(shù)組亥揖,改變原數(shù)組

  • sort()

數(shù)組排序,返回新數(shù)組圣勒,改變原數(shù)組费变。sort()方法會調(diào)用數(shù)組每項的toString()方法,比較字符串進行排序圣贸。

  • splice()

用于數(shù)組的刪除挚歧、插入、替換旁趟,會改變原數(shù)組
一個參數(shù)時昼激,表示刪除的開始位置;
兩個參數(shù)時锡搜,第一個表示刪除的開始位置(0)橙困,第二個表示刪除的個數(shù);
三個參數(shù)時耕餐,刪除的開始位置凡傅、刪除的個數(shù)、添加的元素

  • join()

將原數(shù)組轉(zhuǎn)化成字符串肠缔,默認以空格分隔夏跷,返回替換后的值哼转,不改變原數(shù)組

  • concat()

將兩個數(shù)組連接,返回新數(shù)組槽华,不改變原數(shù)組

  • slice(start, end)

從數(shù)組中返回指定的元素壹蔓,返回新數(shù)組,不改變原數(shù)組

位置方法
  • indexOf()

匹配數(shù)組猫态,第一個參數(shù)為要查詢的值佣蓉,第二個參數(shù)表示開始查詢位置,沒有返回-1亲雪。

  • lastIndexOf()

從后面往上找勇凭,參數(shù)同上,起始位置從正向開始數(shù)

  • includes()

判斷數(shù)組是否包含某一元素义辕,返回布爾值虾标。
第一個參數(shù),要查詢的元素
第二個參數(shù)灌砖,查詢的開始位置璧函。負數(shù),表示從右數(shù)過來第幾個周崭,但是不改變判斷搜索的方向柳譬,搜索方向還是從左到右。

迭代方法
  • every()

數(shù)組元素全部滿足添加返回true续镇,否則返回false

let nums = [1, 2, 3, 4, 5, 4, 3, 2, 1];
let everyResults = nums.every((item, index,array) => {
  return (item > 0);
    });
  console.log(everyResults); //true
  • some()

只要有一項滿足條件就返回true,否則返回false销部。

let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];
let someResult = numbers.some((item, index, array)=>{
  return (item > 3);
});
console.log(someResult);
  • find()

array.find(function(currentValue, index, arr), thisValue)

//返回符合測試條件的數(shù)組元素值摸航,如果沒有符合條件的則返回undefined。
// 獲取數(shù)組中大于18第一個的元素
let arr2 = [15, 6.8, 49.5, 102];
function findResult(array, value) {
  return array.find(value => {
    return value > 18
  })
}
console.log(findResult(arr2, 18));
  • findIndex()

原理和 find() 相同舅桩,但返回的索引值

  • filter()

過濾酱虎。過濾的元素組成新數(shù)組,不改變原數(shù)組擂涛。

// 獲取數(shù)組中大于18第一個的元素
let arr2 = [15, 6.8, 49.5, 102];
function findResult(array, value) {
  return array.find(value => {
    return value > 18
  })
}
console.log(findResult(arr2, 18));
  • forEach()

遍歷數(shù)組中的每個元素读串,并為每個元素執(zhí)行指定操作,不改變元素組

let nums = [1, 2, 3, 4, 5, 4, 3, 2, 1];
nums.forEach((item, index, array) => {
  console.log(item)
})
  • map()

對數(shù)組中的每一項執(zhí)行一些操作撒妈,返回新數(shù)組恢暖,改變原數(shù)組。

let numbers = [1,2,3,4,5,4,3,2,1];
let mapResult = numbers.map(function(item, index, array) {
    return item + 1;
});
console.log(mapResult);//[2, 3, 4, 5, 6, 5, 4, 3, 2]
歸并方法
  • reduce()

prev:前一個值; cur: 當前值; index: 項的索引; array: 數(shù)組對象 狰右。將數(shù)組中的數(shù)相加杰捂,返回和,不改變原數(shù)組棋蚌。

// reduce 統(tǒng)計同一元素出現(xiàn)的次數(shù)
    let arr6 = [1, 2, 3, 1, 2, 5, 4, 6, 7, 8, 9, 1, 3];
function countNum(array, item) {
  return arr6.reduce((total, cur) => {
    total += cur === item ? 1 : 0;
    return total;
  }, 0);
}
console.log(countNum(arr6, 1)); //3
  • reduceRtght()

方法的功能和 reduce() 功能是一樣的嫁佳,不同的是 reduceRight() 從數(shù)組的末尾向前將數(shù)組中的數(shù)組項做累加挨队。

區(qū)分數(shù)組和對象
let a = [];
let b = {};
function isArray (value) {
  //小寫的是返回的值的格式中默認的,大寫的是對象的名字Array
  return Object.prototype.toString.apply(value) == "[object Array]";
};
console.log(isArray(a));//true
console.log(isArray(b));//false

清空數(shù)組方法

  • arr.length = 0;

修改數(shù)組本身蒿往,如果通過一個不同的變量訪問他盛垦,會得到修改的數(shù)組。

  • arr = [];

創(chuàng)建一個新數(shù)組瓤漏,并為其賦予一個變量的引用情臭。任何其他引用不受影響,并指向原數(shù)組赌蔑。

  • arr.splice(0, arr.length);

  • while (arr.pop()) {}

數(shù)組去重

  • 要求:將兩個數(shù)組合并俯在,并去除重復部分
let arr1 = [1, 2, 3, 4, 5, 6];
let arr2 = [1, 2, 3, 4, 8, 6];
  • Array.filter() + indexOf()

思路:將兩個數(shù)組拼接,使用ES6中的方法Array.filter()遍歷數(shù)組娃惯,并結(jié)合indexOf()排除重復項跷乐。

function distinct(item1, item2) {
  let arr = item1.concat(item2);
  return arr.filter((item, index) => {
    return arr.indexOf(item) === index;
  });
}
console.log(distinct(arr1, arr2));
  • 雙重for循環(huán)

思路:外層for循環(huán)遍歷元素,內(nèi)層循環(huán)檢查元素是否重復趾浅,如果元素重復可以使用push()也可以使用splice()

// 雙重for循環(huán)
function distinct(item1, item2) {
  let arr = item1.concat(item2);
  console.log(arr);
  for (let i = 0; i <= arr.length; i++) {
    for (let j = i + 1; j <= arr.length; j++) {
      if (arr[i] == arr[j]) {
        arr.splice(j, 1);
        // splice 會改變數(shù)組長度愕提,要將數(shù)組下標減一
        j--;
      }
    }
  }
  return arr;
}
console.log(distinct(arr1, arr2));
  • for...of + includes()

思路:雙重for循環(huán)的升級。外層for…代替for循環(huán)皿哨,把內(nèi)層循環(huán)替換為includes(). 先創(chuàng)建一個空數(shù)組浅侨,當includes()返回false時,就將該元素push到數(shù)組中证膨。類式如输,可以用indexOf替換includes。

function distinct(item1, item2) {
  let arr = item1.concat(item2);
  console.log(arr);
  let newArr = [];
  for (const i of arr) {
    !newArr.includes(i) ? newArr.push(i) : "";
  }
  return newArr;
}
console.log(distinct(arr1, arr2));
  • Array.sort()

思路:先將數(shù)組進行排序央勒,然后比較兩個相鄰元素是否相同不见,去除重復項。

function distinct(item1, item2) {
  let arr = item1.concat(item2);
  arr = arr.sort();
  for (let i = 0; i < arr.length; i++) {
      arr[i] === arr[i - 1] && arr.splice(i, 1);
  }
  return arr;
}
console.log(distinct(arr1, arr2));
  • new Set()

思路:利用Set 對象存儲的值總是唯一的特性崔步。

function distinct(item1, item2) {
  return Array.from(new Set([...item1, ...item2]));
}
console.log(distinct(arr1, arr2));
  • for…of + Object

思路:創(chuàng)建一個空對象稳吮,用for循環(huán)遍歷,利用對象的屬性不能重復的特點井濒,校驗元素是否重復灶似。

function distinct(item1, item2) {
  let arr = item1.concat(item2);
  let newArr = [];
  let obj = {};
  for (let i of arr) {
    if (!obj[i]) {
      newArr.push(i);
      obj[i] = 1;
    }
  }
  return newArr;
}
console.log(distinct(arr1, arr2));

性能:6> 5> 4> 3> 1> 2
參考網(wǎng)站http://www.reibang.com/p/6300a031dba5

數(shù)組扁平化

什么是數(shù)組扁平化?

數(shù)組扁平化是指:將多維數(shù)組轉(zhuǎn)換成一維數(shù)組,即將數(shù)組內(nèi)部嵌套著其他數(shù)組的數(shù)組提煉成沒有嵌套的一維數(shù)組瑞你。

如何實現(xiàn)數(shù)組扁平化拳喻?
  • Array.prototype.flat()

ES6提供的方法振愿,用于數(shù)組扁平化,會返回一個新數(shù)組,不會改變元素組恩尾。

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

flat()默認扁平一層嵌套质况,可以帶一個整數(shù)參數(shù)便是扁平的層數(shù);

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

無論嵌套多少層,可以通過傳遞Infinity作為參數(shù)轉(zhuǎn)為一維數(shù)組纺铭。

  • 使用擴展運算符和concat()

可以使用擴展運算符展開數(shù)組,再用concat()可以合并數(shù)組刀疙,但操作做一次只能展開一層舶赔;

let array = [1, [[2, 3], 4]] 
function flatten(array) {
    return [].concat(...array)
}
console.log(flatten(array))
// 打印[1, [2, 3], 4]

要完全展開要對嵌套的數(shù)組進行遍歷才能展開

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

function flatten(array) {
  // 先用some()檢測數(shù)組中的元素是否是數(shù)組
  while (array.some(item => {
      return Object.prototype.toString.call(item) === "[object Array]"
    })) {
    array = [].concat(...array);
  }
  return array;
};
console.log(flatten(arr));
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市谦秧,隨后出現(xiàn)的幾起案子竟纳,更是在濱河造成了極大的恐慌,老刑警劉巖疚鲤,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锥累,死亡現(xiàn)場離奇詭異,居然都是意外死亡集歇,警方通過查閱死者的電腦和手機桶略,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诲宇,“玉大人际歼,你說我怎么就攤上這事」美叮” “怎么了鹅心?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纺荧。 經(jīng)常有香客問我旭愧,道長,這世上最難降的妖魔是什么虐秋? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任榕茧,我火速辦了婚禮,結(jié)果婚禮上客给,老公的妹妹穿的比我還像新娘。我一直安慰自己肢簿,他們只是感情好靶剑,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著池充,像睡著了一般桩引。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上收夸,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天坑匠,我揣著相機與錄音,去河邊找鬼卧惜。 笑死厘灼,一個胖子當著我的面吹牛夹纫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播设凹,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舰讹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了闪朱?” 一聲冷哼從身側(cè)響起月匣,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奋姿,沒想到半個月后锄开,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡称诗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年萍悴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粪狼。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡退腥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出再榄,到底是詐尸還是另有隱情狡刘,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布困鸥,位于F島的核電站嗅蔬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疾就。R本人自食惡果不足惜澜术,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望猬腰。 院中可真熱鬧鸟废,春花似錦、人聲如沸姑荷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鼠冕。三九已至添寺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間懈费,已是汗流浹背计露。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人票罐。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓叉趣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胶坠。 傳聞我的和親對象是個殘疾皇子君账,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355