目錄
Array
concat
every
filter
forEach
map
reduce
reduceRight
push
pop
unshift
shift
reverse
slice
splice
some
sort
toString
ES6 中新添的数组方法
copyWithin
find
findIndex
fill
keys
entries
includes
首頁 web前端 js教程 JavaScript數組方法總結

JavaScript數組方法總結

Jan 23, 2017 am 11:10 AM

JavaScript 中的陣列本身就很特別,不像C 或Java,搞了數組、list 一整套東西,JS 中的數組就完全可以當作一個棧或隊列來使用,四大操作pop、push、 shift、unshift。

對於一個數組方法,最關心的有兩個問題, 返回值是什麼,會不會對原始數組造成影響 ,典型的例子就是 splice 和 slice 方法。對於那些傳回原始數組的函數,我們可以直接調用數組的鍊式調用,很酷( array.filter().sort().reverse() )。

我想帶著這兩個疑問,來總結下 Array 的陣列方法。

Array

Array.length 是數組的長度,每個新建的數組對像都會有 length 對象,可以透過 Array.prototype 修改原型,不過數組的基本使用和操作不是今天的重點,我們來看數組方法。

一般情況下,陣列方法最後都會帶有一個 thisArg 的參數,而這個參數會指定內部 this 的指向。如果參數中有回掉函數,這個回掉函數一般接受 3 個參數,value、index 和 array,分別代表目前傳入的值,目前傳入值所在的索引和目前的處理的陣列。

目錄索引:

concat

這個方法可以用於數組的拼接,參數是一個或多個數組,傳回的結果是拼接數組。

concat 方法將建立一個新數組,然後將調用它的對象(this 指向的對象,即原始數組)中的元素以及所有參數中的數組類型的參數中的元素以及非數組類型的參數本身按照順序放入這個新數組,並傳回該數組。 concat 方法並未修改原數組和參數數組,而且對非數組物件同樣有效果。

  1. 傳回拼接的新數組;

  2. 不修改原始數組和參數數組;

  3. 參數可以是非數組。

var a1 = [1, 2, 3],
  a2 = [4, 5, 6],
  a3 = [7, 8, 9];
var newarr = a1.concat(a2, a3);
newarr //[1, 2, 3, 4, 5, 6, 7, 8, 9]
a1 //[1, 2, 3]
newarr = a1.concat(4, a3);//[1, 2, 3, 4, 7, 8, 9]
newarr = a1.concat('hello');//[1, 2, 3, "hello"]
登入後複製

every

every() 方法測試數組的所有元素是否都通過了指定函數的測試。 

arr.every(callback) 會對每個元素都執行 callback 方法,直到 callback 回傳 false。有時 every 方法會和 forEach 方法相比較,因為 forEach 無法停止,而 every 方法返回 flase 時可以中途停止。

  1. 若全部通過測試,函數回傳值 true,中途退出,回傳 false;

  2. 不對原數組產生影響。

function isBigEnough(element, index, array) {
  console.log(index);
  return (element >= 10);
}
var passed = [12, 5, 8, 130, 44].every(isBigEnough);
// 0
// 1
// passed is false
passed = [12, 54, 18, 130, 44].every(isBigEnough);
// 0 1 2 3 4
// passed is true
登入後複製

filter

filter() 方法使用指定的函數測試所有元素,並建立一個包含所有通過測試的元素的新數組。

其實這個方法就是一個過濾方法,前面那個 every 方法,只判斷不過濾,filter 會過濾掉一些不符合條件的,並返回新數組。

  1. 傳回一個滿足過濾條件的新陣列;

  2. 不會改變原數組。

function isBigEnough(element, index, array) {
  return (element >= 10);
}
var a1 = [19, 22, 6, 2, 44];
var a2 = a1.filter(isBigEnough);
a1 //[19, 22, 6, 2, 44]
a2 //[19, 22, 44]
登入後複製

forEach

forEach() 方法對數組的每個元素執行一次提供的函數(

forEach() 方法對數組的每個元素執行一次提供的函數(
    forEach()。 
  1. 函數沒有回傳值,即 underfined;
  2. 不會對原數組產生影響。
function logArrayElements(element, index, array) {
    console.log("a[" + index + "] = " + element);
}

// 注意索引2被跳过了,因为在数组的这个位置没有项
var result = [2, 5, 9].forEach(logArrayElements);
// a[0] = 2
// a[1] = 5
// a[2] = 9
result //underfined
登入後複製

indexOf

    indexOf()方法返回給定元素能找在數組中找到的第一個索引值,否則返回-1。
  1. 回傳值是找到元素的索引值或 -1;
  2. 不會對原數組產生影響。

var array = [1, 2, 5];
array.indexOf(5); // 2
array.indexOf(7); // -1
登入後複製

join

join() 方法將陣列中的所有元素連接成一個字串。

    其實,對於 join 想到的第一個是字串的 split 操作,這兩個經常搭配用來處理字串。
  1. 傳回拼接的字串;
  2. 不會對原數組產生影響。
var a1 = [1, 2, 3];
var a2 = a1.join();
a1 //[1, 2, 3]
a2 //"1,2,3"
a2 = a1.join("");//"123"
a2 = a1.join("-");//"1-2-3"
登入後複製

lastIndexOf

lastIndexOf() 方法返回指定元素(也存在不有效的 JavaScript 值或不存在1組(即存在1)的 JavaScript 組數,即存在數字類型的從陣列的後面向前查找,從 fromIndex 開始。 

    其實這個就是 indexOf 的翻版。
  1. 回傳找到的第一個元素的索引;
  2. 不對原數組產生影響。
var array = [2, 5, 9, 2];
var index = array.lastIndexOf(2);
// index is 3
index = array.lastIndexOf(7);
// index is -1
index = array.lastIndexOf(2, 3);
// index is 3
index = array.lastIndexOf(2, 2);
登入後複製
🎜🎜

map

map() 方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组。 

map reduce 这两个函数在处理数组上一直都是一把手,带来很大的便捷性。

  1. 返回一个经过回掉函数处理的新数组;

  2. 不对原数组产生影响。

var a1 = [1, 4, 9];
var a2 = a1.map(Math.sqrt);
a1 //[1, 4, 9]
a2 //[1, 2, 3]
登入後複製

reduce

reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始合并,最终为一个值。 

reduce 是一个合并的过程,从左到右,直到把所有元素合并到一起,并返回最终的结果。它接受两个参数,第一个参数是一个回掉函数,第二个参数是一个初始值,表示处理第一个元素时的前一个值。这个回掉函数接受四个参数,依次是 accumulator(上次处理的结果),currentValue(当前元素的值),index(当前元素索引),array(调用 reduce 的数组)。

  1. 返回最终合并的结果,即回掉函数的输出,可以为字符串,对象,数组等任意结果;

  2. 不对原数组产生影响。

var getAdd = (pre, cur) => pre + cur;
var a1 = [1, 2, 3];
var a2 = a1.reduce(getAdd, 0);
a1 //[1, 2, 3]
a2 //6
登入後複製

reduceRight

reduceRight() 方法接受一个函数作为累加器(accumulator),让每个值(从右到左,亦即从尾到头)缩减为一个值。(与 reduce() 的执行方向相反)

var toStr = (pre, cur) => '' + pre + cur;
var a1 = [1, 2, 3];
var a2 = a1.reduce(toStr, '');
a2 //"123"
a2 = a1.reduceRight(toStr, '');
a2 //"321"
登入後複製

push

push() 方法添加一个或多个元素到数组的末尾,并返回数组新的长度(length 属性值)。

如果把数组当作栈,push pop 操作是栈进和出,而往往很多人会忽略函数执行后的返回值。

  1. 返回 push 操作执行之后数组的长度;

  2. 肯定改变。

var a1 = [1, 2, 3];
var a2 = a1.push(4);
a1 //[1, 2, 3, 4]
a2 //4
登入後複製

pop

pop() 方法删除一个数组中的最后的一个元素,并且返回这个元素。 

  1. 返回删除的这个元素;

  2. 肯定改变。

var a1 = [1, 2, 3];
var a2 = a1.pop();
a1 //[1, 2]
a2 //3
登入後複製

unshift

unshift() 方法在数组的开头添加一个或者多个元素,并返回数组新的 length 值。

  1. 返回 length 值;

  2. 肯定改变。

var a1 = [1, 2, 3];
var a2 = a1.unshift(4);
a1 //[4, 1, 2, 3]
a2 //4
登入後複製

shift

shift() 方法删除数组的 第一个 元素,并返回这个元素。该方法会改变数组的长度。 

shift 方法和 push 方法可以组成一个队列的操作啦。

  1. 返回删除的这个元素;

  2. 肯定改变。

reverse

reverse() 方法颠倒数组中元素的位置。第一个元素会成为最后一个,最后一个会成为第一个。 

  1. 函数返回值是修改了的原数组;

  2. 原数组会修改。

var a1 = [1, 2, 3];
var a2 = a1.reverse();
a1 //[3, 2, 1]
a1 === a2; //true
登入後複製

slice

slice() 方法会浅复制(shallow copy)数组的一部分到一个新的数组,并返回这个新数组。 

slice 的参数包括拷贝的初识位置,结束位置(左闭右开),与 splice 有区别。由于不会改变原数组,这个数组可以用于前拷贝,比如经常看别人使用: arr.slice(0) ,表示拷贝数组。

  1. 返回浅拷贝后的新数组;

  2. 不会改变原数组。

var a1 = [1, 2, 3, 4, 5];
var a2 = a1.slice(1, 3);
a1 //[1, 2, 3, 4, 5]
a2 //[2, 3]
登入後複製

splice

splice() 方法用新元素替换旧元素,以此修改数组的内容。 

如其名,分割,会修改原数组的内容,返回一个新数组,而且它的参数也比较多,第一个参数表示初始位置,第二个参数表示分割长度,第三个参数及以后表示分割后在分割处添加新元素。

  1. 返回分割的元素组成的数组;

  2. 会对数组进行修改,原数组会减去分割数组。

var a1 = [1, 2, 3, 4];
var a2 = a1.splice(1, 2);
a1 //[1, 4]
a2 //[2, 3]
a1 = [1, 2, 3, 4];
a2 = a1.splice(1, 2, 5, 6);
a1 //[1, 5, 6, 4]
登入後複製

some

some() 方法测试数组中的某些元素是否通过了指定函数的测试。 

sort

sort() 方法对数组的元素做原地的排序,并返回这个数组。 sort 排序可能是不稳定的。默认按照字符串的Unicode码位点(code point)排序。 

sort 函数用于排序,比较常用,若没有制定排序函数,则按照 unicode 位点进行排序,而且数字会被转成字符串,所以 ‘123’ 要排在 ‘11’ 的后面。

我们会用 sort 做一些有意思的排序,比如汉字按照拼音排序。

  1. 返回排序后的原数组;

  2. 会对数组进行修改。

var big = function(a, b){
  return a - b;
}
var a1 = [2, 4, 77, 1];
var a2 = a1.sort(big);
a1 //[1, 2, 4, 77]
a1 === a2; //true
登入後複製

localeCompare 可以对汉字进行排序,当同时出现汉字和字母的时候会有 bug:

var sort_py = function(a, b){
  return a.localeCompare(b);
}
var a1 = ["北京", "上海", "南京", "合肥"];
a1.sort(sort_py);
//["北京", "合肥", "南京", "上海"]
登入後複製

toString

toString() 返回一个字符串,表示指定的数组及其元素。 

显然,这个方法和 join 方法比较一下。

  1. 返回拼接的字符串;

  2. 不会改变原数组。

var a1 = [1, 2, 3];
var a2 = a1.toString();
a2 //"1,2,3"
登入後複製

ES6 中新添的数组方法

上面的这些方法都是 ES5 的,来看看 ES6 添加了哪些新方法。

copyWithin

copyWithin() 方法会浅拷贝数组的部分元素到同一数组的不同位置,且不改变数组的大小,返回该数组。 

接受三个参数,分别是要拷贝到的位置 target,拷贝开始位置 start 和结束位置 end。

  1. 返回修改了的原数组;

  2. 会对数组进行修改,且是浅拷贝;

  3. 参数可负,负值时倒推,且 end 为空表示数组长度。

var a1 = [1, 2, 3, 4, 5];
var a2 = a1.copyWithin(0, 2, 4);
a1 //[3, 4, 3, 4, 5]
a2 //[3, 4, 3, 4, 5]
a1 === a2; //true
登入後複製

find

如果数组中某个元素满足测试条件,find() 方法就会返回满足条件的第一个元素,如果没有满足条件的元素,则返回 undefined。 MDN array.find

  1. 返回找到的那个元素,若未找到,返回 underfined

  2. 不对原数组产生影响。

function isBigEnough(element, index, array) {
  return (element >= 10);
}
var a1 = [8, 18, 14];
var num = a1.find(isBigEnough); //18
登入後複製

findIndex

findIndex()方法用来查找数组中某指定元素的索引, 如果找不到指定的元素, 则返回 -1。 

这个方法可以参考 find 方法,只是返回值是元素的索引而非元素本身。

fill

使用 fill() 方法,可以将一个数组中指定区间的所有元素的值, 都替换成或者说填充成为某个固定的值。 

fill 方法接受三个参数,第一个参数 value 表示要填充到值,后面两个 start 和 end 表示开始和结束位置,可选,且左闭右开。

  1. 函数返回值是修改了的原数组;

  2. 可对数组产生影响。

var a1 = [1, 2, 3, 4, 5];
var a2 = a1.fill(6, 1, 4);
a1 //[1, 6, 6, 6, 5]
a2 //[1, 6, 6, 6, 5]
a1 === a2; //true
登入後複製

keys

数组的 keys() 方法返回一个数组索引的迭代器。 

这个方法会返回一个数组索引的迭代器,迭代器在 ES6 中有特殊的用途。

  1. 函数返回一个迭代器对象;

  2. 不会改变原数组。

var arr = ["a", "b", "c"];
var iterator = arr.keys();

console.log(iterator.next()); // { value: 0, done: false }
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
登入後複製

entries

entries() 方法返回一个 Array Iterator 对象,该对象包含数组中每一个索引的键值对。 

var arr = ["a", "b", "c"];
var eArr = arr.entries();

console.log(eArr.next().value); // [0, "a"]
console.log(eArr.next().value); // [1, "b"]
console.log(eArr.next().value); // [2, "c"]
登入後複製

includes

includes() 方法用来判断当前数组是否包含某指定的值,如果是,则返回 true,否则返回 false。 

该函数接受两个参数,第二个参数表示开始查找位置,起始位置为 0。这个方法与 indexOf 方法最大的区别不仅在于返回值一个是索引,一个是布尔值,indexOf 方法使用的是 === 来判断,无法判断 NaN 情况,而 includes 可以判断。

  1. 返回 true 或 false;

  2. 不会改变原数组。

var a1 = [1, NaN];
a1.indexOf(NaN);//-1
a1.includes(NaN);//true
登入後複製

 

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

誰得到更多的Python或JavaScript? 誰得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? 如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

JavaScript難以學習嗎? JavaScript難以學習嗎? Apr 03, 2025 am 12:20 AM

學習JavaScript不難,但有挑戰。 1)理解基礎概念如變量、數據類型、函數等。 2)掌握異步編程,通過事件循環實現。 3)使用DOM操作和Promise處理異步請求。 4)避免常見錯誤,使用調試技巧。 5)優化性能,遵循最佳實踐。

如何實現視差滾動和元素動畫效果,像資生堂官網那樣?
或者:
怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? 如何實現視差滾動和元素動畫效果,像資生堂官網那樣? 或者: 怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? Apr 04, 2025 pm 05:36 PM

實現視差滾動和元素動畫效果的探討本文將探討如何實現類似資生堂官網(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

console.log輸出結果差異:兩次調用為何不同? console.log輸出結果差異:兩次調用為何不同? Apr 04, 2025 pm 05:12 PM

深入探討console.log輸出差異的根源本文將分析一段代碼中console.log函數輸出結果的差異,並解釋其背後的原因。 �...

See all articles