目錄
此外,可以傳遞可選的第二個參數,作為每次函數調用的上下文(this).
array.concat()在沒有參數的情況下,傳回來源數組的淺拷貝。 #淺拷貝意味著新數組和原始數組保持相同的物件引用,這通常是好事。例如:
排序:.sort(compareFunction)
计算:.reduce和.reduceRight
复制:.slice
强大的.splice
查找:.indexOf
操作符:in
走近.reverse
参考
首頁 web前端 js教程 詳細介紹有趣的JavaScript原生數組函數的程式碼範例

詳細介紹有趣的JavaScript原生數組函數的程式碼範例

Mar 06, 2017 pm 02:37 PM

在JavaScript中,建立陣列可以使用Array建構函數,或是使用陣列直接量[],後者是首選方法。 Array物件繼承自Object.prototype,對數組執行typeof操作符傳回object而不是array。然而,[] instanceof Array也回傳true。也就是說,類別數組物件的實作更複雜,例如strings物件、arguments對象,arguments物件不是Array的實例,但有length屬性,並能透過索引取值,所以能像陣列一樣進行循環操作。
在本文中,我將複習一些陣列原型的方法,並探索這些方法的用法。

  • 迴圈:.forEach

  • 判斷:.some與.every

  • 區分.join和.concat

  • 堆疊和佇列的實作:.pop, .push, .shift,和.unshift

  • ##模型映射:.map

  • 查詢:.filter

  • 排序:.sort

  • 計算:.reduce和. reduceRight

  • 複製:.slice

  • #強大的.splice

  • ##尋找:.indexOf
  • 運算子:in
  • 走近.reverse

    循環:.forEach
  • 這是JavaScript中最簡單的方法,但IE7和IE8不支援此方法。

  • .forEach 有一個回呼函數作為參數,遍歷數組時,每個數組元素都會呼叫它,回呼函數接受三個參數:
  • value:當前元素
  • index:目前元素的索引

#array:要遍歷的陣列

此外,可以傳遞可選的第二個參數,作為每次函數調用的上下文(this).

['_', 't', 'a', 'n', 'i', 'f', ']'].forEach(function (value, index, array) {
    this.push(String.fromCharCode(value.charCodeAt() + index + 2))
}, out = [])
out.join('')
// <- &#39;awesome&#39;
登入後複製

後文會提及.join,在這個示例中,它用於拼接數組中的不同元素,效果類似於out[0] + ” + out[1] + ” + out[2] + ” + out[n]。

不能中斷.forEach循環,並且拋出異常也是不明智的選擇。 .Any(x => x.IsAwesome) 、 .All(x => x.IsAwesome)類似。 ,並且也有一個可選的第二個上下文參數。 。
注意,當回呼函數的value < 10時,中斷函數循環。 concat

.join和.concat 經常混淆。一個新數組,作為來源數組的淺拷貝。 ##.concat傳回一個新數組

array.concat()在沒有參數的情況下,傳回來源數組的淺拷貝。 #淺拷貝意味著新數組和原始數組保持相同的物件引用,這通常是好事。例如:

max = -Infinity
satisfied = [10, 12, 10, 8, 5, 23].some(function (value, index, array) {
    if (value > max) max = value
    return value < 10
})
console.log(max)
// <- 12
satisfied
// <- true
登入後複製

堆疊和佇列的實作:.pop, .push, .shift和.unshift

    每個人都知道.push可以再數組末尾添加元素,但是你知道可以使用[].push('a', 'b', 'c', 'd', 'z')一次加入多個元素嗎?
  • .pop 方法是.push 的反操作,它會傳回被刪除的陣列結尾元素。如果陣列為空,將傳回void 0 (undefined),使用.pop和.push可以建立LIFO (last in first out)堆疊。

    var a = { foo: &#39;bar&#39; }
    var b = [1, 2, 3, a]
    var c = b.concat()
    console.log(b === c)
    // <- false
    b[3] === a && c[3] === a
    // <- true
    登入後複製
  • 模型對應:.map
  • .map為陣列中的每個元素提供了一個回呼方法,並傳回有呼叫結果構成的新陣列。回呼函數只對已經指定值的陣列索引執行;它不會對已刪除的或未指定值的元素呼叫。
  • Array.prototype.map 和上面提到的.forEach、.some和.every有相同的參數格式:.map(fn(value, index, array), thisArgument)

    function Stack () {
        this._stack = []
    }
    Stack.prototype.next = function () {
        return this._stack.pop()
    }
    Stack.prototype.add = function () {
        return this._stack.push.apply(this._stack, arguments)
    }
    stack = new Stack()
    stack.add(1,2,3)
    stack.next()
    // <- 3
    相反,可以使用.shift和 .unshift创建FIFO (first in first out)队列。
    
    function Queue () {
        this._queue = []
    }
    Queue.prototype.next = function () {
        return this._queue.shift()
    }
    Queue.prototype.add = function () {
        return this._queue.unshift.apply(this._queue, arguments)
    }
    queue = new Queue()
    queue.add(1,2,3)
    queue.next()
    // <- 1
    Using .shift (or .pop) is an easy way to loop through a set of array elements, while draining the array in the process.
    list = [1,2,3,4,5,6,7,8,9,10]
    while (item = list.shift()) {
        console.log(item)
    }
    list
    // <- []
    登入後複製
  • undefined × 3很好地解釋了.map不會對已刪除的或未指定值的元素調用,但仍然會被包含在結果數組中。 .map在建立或改變陣列時非常有用,看下面的範例:
values = [void 0, null, false, &#39;&#39;]
values[7] = void 0
result = values.map(function(value, index, array){
    console.log(value)
    return value
})
// <- [undefined, null, false, &#39;&#39;, undefined × 3, undefined]
登入後複製

查詢:.filter

filter對每個陣列元素執行一次回呼函數,並傳回一個由回調函數傳回true的元素所組成的新數組。回呼函數只會對已經指定值的陣列項呼叫。

通常用法:.filter(fn(value, index, array), thisArgument),跟C#中的LINQ表达式和SQL中的where语句类似,.filter只返回在回调函数中返回true值的元素。

[void 0, null, false, &#39;&#39;, 1].filter(function (value) {
    return value
})
// <- [1]
[void 0, null, false, &#39;&#39;, 1].filter(function (value) {
    return !value
})
// <- [void 0, null, false, &#39;&#39;]
登入後複製

排序:.sort(compareFunction)

如果没有提供compareFunction,元素会被转换成字符串并按照字典排序。例如,”80″排在”9″之前,而不是在其后。

跟大多数排序函数类似,Array.prototype.sort(fn(a,b))需要一个包含两个测试参数的回调函数,其返回值如下:

  • a在b之前则返回值小于0

  • a和b相等则返回值是0

  • a在b之后则返回值小于0

[9,80,3,10,5,6].sort()
// <- [10, 3, 5, 6, 80, 9]
[9,80,3,10,5,6].sort(function (a, b) {
    return a - b
})
// <- [3, 5, 6, 9, 10, 80]
登入後複製

计算:.reduce和.reduceRight

这两个函数比较难理解,.reduce会从左往右遍历数组,而.reduceRight则从右往左遍历数组,二者典型用法:.reduce(callback(previousValue,currentValue, index, array), initialValue)。

previousValue 是最后一次调用回调函数的返回值,initialValue则是其初始值,currentValue是当前元素值,index是当前元素索引,array是调用.reduce的数组。

一个典型的用例,使用.reduce的求和函数。

Array.prototype.sum = function () {
    return this.reduce(function (partial, value) {
        return partial + value
    }, 0)
};
[3,4,5,6,10].sum()
// <- 28
登入後複製

如果想把数组拼接成一个字符串,可以用.join实现。然而,若数组值是对象,.join就不会按照我们的期望返回值了,除非对象有合理的valueOf或toString方法,在这种情况下,可以用.reduce实现:

function concat (input) {
    return input.reduce(function (partial, value) {
        if (partial) {
            partial += &#39;, &#39;
        }
        return partial + value
    }, &#39;&#39;)
}
concat([
    { name: &#39;George&#39; },
    { name: &#39;Sam&#39; },
    { name: &#39;Pear&#39; }
])
// <- &#39;George, Sam, Pear&#39;
登入後複製

复制:.slice

和.concat类似,调用没有参数的.slice()方法会返回源数组的一个浅拷贝。.slice有两个参数:一个是开始位置和一个结束位置。
Array.prototype.slice 能被用来将类数组对象转换为真正的数组。

Array.prototype.slice.call({ 0: &#39;a&#39;, 1: &#39;b&#39;, length: 2 })
// <- [&#39;a&#39;, &#39;b&#39;]
这对.concat不适用,因为它会用数组包裹类数组对象。

Array.prototype.concat.call({ 0: &#39;a&#39;, 1: &#39;b&#39;, length: 2 })
// <- [{ 0: &#39;a&#39;, 1: &#39;b&#39;, length: 2 }]
登入後複製

此外,.slice的另一个通常用法是从一个参数列表中删除一些元素,这可以将类数组对象转换为真正的数组。

function format (text, bold) {
    if (bold) {
        text = &#39;<b>&#39; + text + &#39;</b>&#39;
    }
    var values = Array.prototype.slice.call(arguments, 2)
    values.forEach(function (value) {
        text = text.replace(&#39;%s&#39;, value)
    })
    return text
}
format(&#39;some%sthing%s %s&#39;, true, &#39;some&#39;, &#39;other&#39;, &#39;things&#39;)
登入後複製

强大的.splice

.splice 是我最喜欢的原生数组函数,只需要调用一次,就允许你删除元素、插入新的元素,并能同时进行删除、插入操作。需要注意的是,不同于`.concat和.slice,这个函数会改变源数组。

var source = [1,2,3,8,8,8,8,8,9,10,11,12,13]
var spliced = source.splice(3, 4, 4, 5, 6, 7)
console.log(source)
// <- [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ,13]
spliced
// <- [8, 8, 8, 8]
登入後複製

正如你看到的,.splice会返回删除的元素。如果你想遍历已经删除的数组时,这会非常方便。

var source = [1,2,3,8,8,8,8,8,9,10,11,12,13]
var spliced = source.splice(9)
spliced.forEach(function (value) {
    console.log(&#39;removed&#39;, value)
})
// <- removed 10
// <- removed 11
// <- removed 12
// <- removed 13
console.log(source)
// <- [1, 2, 3, 8, 8, 8, 8, 8, 9]
登入後複製

查找:.indexOf

利用.indexOf 可以在数组中查找一个元素的位置,没有匹配元素则返回-1。我经常使用.indexOf的情况是当我有比较时,例如:a === ‘a’ || a === ‘b’ || a === ‘c’,或者只有两个比较,此时,可以使用.indexOf:['a', 'b', 'c'].indexOf(a) !== -1。

注意,如果提供的引用相同,.indexOf也能查找对象。第二个可选参数用于指定开始查找的位置。

var a = { foo: &#39;bar&#39; }
var b = [a, 2]
console.log(b.indexOf(1))
// <- -1
console.log(b.indexOf({ foo: &#39;bar&#39; }))
// <- -1
console.log(b.indexOf(a))
// <- 0
console.log(b.indexOf(a, 1))
// <- -1
b.indexOf(2, 1)
// <- 1
登入後複製

如果你想从后向前搜索,可以使用.lastIndexOf。

操作符:in

在面试中新手容易犯的错误是混淆.indexOf和in操作符:

var a = [1, 2, 5]
1 in a
// <- true, but because of the 2!
5 in a
// <- false
登入後複製

问题是in操作符是检索对象的键而非值。当然,这在性能上比.indexOf快得多。

var a = [3, 7, 6]
1 in a === !!a[1]
// <- true
登入後複製

走近.reverse

该方法将数组中的元素倒置。

var a = [1, 1, 7, 8]
a.reverse()
// [8, 7, 1, 1]
登入後複製

.reverse 会修改数组本身。

参考

《Fun with JavaScript Native Array Functions》

以上就是详细介绍有趣的JavaScript原生数组函数的代码示例的内容,更多相关内容请关注PHP中文网(www.php.cn)!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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)

如何使用WebSocket和JavaScript實現線上語音辨識系統 如何使用WebSocket和JavaScript實現線上語音辨識系統 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統 如何利用JavaScript和WebSocket實現即時線上點餐系統 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統 如何使用WebSocket和JavaScript實現線上預約系統 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

javascript如何使用insertBefore javascript如何使用insertBefore Nov 24, 2023 am 11:56 AM

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

JavaScript與WebSocket:打造高效率的即時影像處理系統 JavaScript與WebSocket:打造高效率的即時影像處理系統 Dec 17, 2023 am 08:41 AM

JavaScript是一種廣泛應用於Web開發的程式語言,而WebSocket則是一種用於即時通訊的網路協定。結合二者的強大功能,我們可以打造一個高效率的即時影像處理系統。本文將介紹如何利用JavaScript和WebSocket來實作這個系統,並提供具體的程式碼範例。首先,我們需要明確指出即時影像處理系統的需求和目標。假設我們有一個攝影機設備,可以擷取即時的影像數

See all articles