搜尋
首頁web前端js教程使用apply方法處理陣列的三個技巧[譯]_javascript技巧

apply方法

apply是所有函數都有的方法.它的簽章如下:
func.apply(thisValue, [arg1, arg2, ...])
如果不考慮thisValue的影響,上面的呼叫等同於:
func(arg1, arg2, ...)
也就是說,apply允許我們將一個數組"解開"成為一個個的參數再傳遞給呼叫函數.讓我們分別看看apply使用中的三個技巧.

技巧1: 將一個數組傳遞給一個不接受數組作為參數的函數

JavaScript中沒有傳回一個陣列中最大值的函數.但是,有一個函數Math.max可以傳回任意多個數值類型的參數中的最大值.再配合apply,我們可以實現我們的目的:

複製程式碼 程式碼如下:

> Math.max.apply(null, [10, -null, [10, - 1, 5])
10

譯者註:注意Math.max方法的參數中只要有一個值被轉為NaN,則該方法直接返回NaN
複製程式碼 程式碼如下:

>Math.max(1,null) //相當於Math.max( 1,0)
1
>Math.max(1,undefinded) //相當於Math.max(1,NaN)
NaN

>Math.max(0,- 0) //正零比負零大,和==不同
0
>Math.max(-0,-1) //負零比-1大
-0


技巧2: 填補稀疏數組

數組中的縫隙
這裡提醒一下讀者:在JavaScript,一個數組就是一個數字到值的映射.所以如果某個索引處缺失了一個元素(一條縫隙)和某個元素的值為undefined,是兩種不同的情況.前者在被Array.prototype中的相關方法(forEach, map, 等.)遍歷時,會跳過那些缺少的元素,而後者不會:
複製程式碼 程式碼如下:

> ["a",,"b"].forEach(function (x) { console.log(x) })
a


> ["a", undefined,"b"].forEach(function (x) { console.log(x) })
a
undefined


譯者註:這裡作者說"數組就是一個數字到值的映射",嚴格意義上是不對的,正確的說法是"數組就是一個字符串到值的映射".下面是證據:
複製程式碼 程式碼如下:

>for (i in ["a", "b"]) {
console.log(typeof i ) //陣列的索引其實是字串
}
"string"
"string"

>["a", "b"].forEach(function (x, i) {
console.log(typeof i) //這裡的i其實不是索引,只是個數字型別的累加器
})
"number"
"number"

你可以使用in運算子來偵測陣列中是否有縫隙.
複製程式碼 程式碼如下:

> 1 in ["a",,"b"]
false
> 1 in ["a", undefined, "b"]
true

譯者註:這裡之所以用1可以,是因為in運算子會把1轉換成"1".

你過你嘗試讀取這個縫隙的值,會返回undefined ,和實際的undefined元素是一樣.
複製程式碼 程式碼如下:


程式碼如下:


> [">> ["> [" a",,"b"][1]
undefined
> ["a", undefined, "b"][1]
undefined
譯者註: [1]也會轉換成["1"]


填補縫隙複製程式碼


程式碼如下:
[ 'a', undefined, 'b' ]


這都是因為apply不會忽略陣列中的縫隙,會把縫隙當作undefined參數傳遞給函數: 複製程式碼
程式碼如下:

> function returnArgs() { return [].slice.call(arguments) }
> returnArgs.apply(null, ["a","b"])
[ 'a ', undefined, 'b' ]

但需要注意的是,如果Array方法接收到的參數是一個單獨的數字,則會把這個參數當成數組長度,傳回一個新數組:
複製程式碼 程式碼如下:

> Array.apply(null, [ 3 ])
[ , , ]

因此,最可靠的方法是寫一個這樣的函數來做這種工作:
複製代碼 代碼如下:

function fillHoles(arr) {
var result = [];
for(var i=0; i result[i] = arr[i];
}
return result;
}

執行:
複製程式碼 程式碼如下:

> fillHoles(["a",,"b"])
[ 'a', undefined, 'b' ]

Underscore中的_.compact函數會移除所有在陣列中的假值,包括縫隙:

複製程式碼 程式碼如下:

> _.compact(["a",,"b"])
[ 'a', 'b' ]
> _.compact(["a", undefined, "b"])
[ 'a', 'b' ]
> _.compact(["a", false, "b "])
[ 'a', 'b' ]


技巧3: 扁平化陣列

任務:將一個包含多個陣列元素的陣列轉換為一階陣列.我們利用apply解包數組的能力來配合concat來做這件事:
複製程式碼 程式碼如下:

> Array.prototype.concat.apply([], [["a"], ["b"]])
[ 'a' , 'b' ]

混合非數組類型的元素也可以:
複製代碼 代碼如下:

> Array.prototype.concat.apply([], [["a"], "b"])
[ 'a', 'b' ]

apply方法的thisValue必須指定為[],因為concat是一個陣列的方法,不是一個獨立的函數.這種寫法的限制是最多只能扁平化二階數組:
複製程式碼 程式碼如下:

> Array.prototype.concat.apply([], [[["a "]], ["b"]])
[ [ 'a' ], 'b' ]


所以你應該考慮一個替代方案.例如Underscore中的_.flatten函數就可以處理任一層數的巢狀陣列

複製程式碼 程式碼如下:


程式碼如下:

🎜> 🎜> 🎜> flatten([[["a"]], ["b"]])
[ 'a', 'b' ] 參考

JavaScript: sparse arrays vs. dense arrays

ECMAScript.next: Array.from() and Array.of()
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
php 怎么求2个数组相同的元素php 怎么求2个数组相同的元素Dec 23, 2022 am 10:04 AM

php求2个数组相同元素的方法:1、创建一个php示例文件;2、定义两个有相同元素的数组;3、使用“array_intersect($array1,$array2)”或“array_intersect_assoc()”方法获取两个数组相同元素即可。

c语言数组如何初始化c语言数组如何初始化Jan 04, 2023 pm 03:36 PM

C语言数组初始化的三种方式:1、在定义时直接赋值,语法“数据类型 arrayName[index] = {值};”;2、利用for循环初始化,语法“for (int i=0;i<3;i++) {arr[i] = i;}”;3、使用memset()函数初始化,语法“memset(arr, 0, sizeof(int) * 3)”。

用Python实现动态数组:从入门到精通用Python实现动态数组:从入门到精通Apr 21, 2023 pm 12:04 PM

Part1聊聊Python序列类型的本质在本博客中,我们来聊聊探讨Python的各种“序列”类,内置的三大常用数据结构——列表类(list)、元组类(tuple)和字符串类(str)的本质。不知道你发现没有,这些类都有一个很明显的共性,都可以用来保存多个数据元素,最主要的功能是:每个类都支持下标(索引)访问该序列的元素,比如使用语法Seq[i]​。其实上面每个类都是使用数组这种简单的数据结构表示。但是熟悉Python的读者可能知道这3种数据结构又有一些不同:比如元组和字符串是不能修改的,列表可以

c++数组怎么初始化c++数组怎么初始化Oct 15, 2021 pm 02:09 PM

c++初始化数组的方法:1、先定义数组再给数组赋值,语法“数据类型 数组名[length];数组名[下标]=值;”;2、定义数组时初始化数组,语法“数据类型 数组名[length]=[值列表]”。

javascript怎么给数组中增加元素javascript怎么给数组中增加元素Nov 04, 2021 pm 12:07 PM

增加元素的方法:1、使用unshift()函数在数组开头插入元素;2、使用push()函数在数组末尾插入元素;3、使用concat()函数在数组末尾插入元素;4、使用splice()函数根据数组下标,在任意位置添加元素。

Java Fluent Mybatis聚合查询与apply方法流程的示例分析Java Fluent Mybatis聚合查询与apply方法流程的示例分析May 22, 2023 pm 01:31 PM

数据准备为了聚合查询的条件,添加了几条数据。MIN我们试着获取最小的年龄。方法实现@OverridepublicIntegergetAgeMin(){Mapresult=testFluentMybatisMapper.findOneMap(newTestFluentMybatisQuery().select.min.age("minAge").end()).orElse(null);returnresult!=null?Convert.toInt(result.get(&qu

php怎么判断数组里面是否存在某元素php怎么判断数组里面是否存在某元素Dec 26, 2022 am 09:33 AM

php判断数组里面是否存在某元素的方法:1、通过“in_array”函数在数组中搜索给定的值;2、使用“array_key_exists()”函数判断某个数组中是否存在指定的key;3、使用“array_search()”在数组中查找一个键值。

go语言中元组是什么go语言中元组是什么Dec 27, 2022 am 11:27 AM

元组是固定长度不可变的顺序容器(元素序列),go语言中没有元组类型,数组就相当于元组。在go语言中,数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成;数组的声明语法为“var 数组变量名 [元素数量]Type”。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。