国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務(wù)器之家 - 編程語言 - JavaScript - JS合并數(shù)組的幾種方法及優(yōu)劣比較

JS合并數(shù)組的幾種方法及優(yōu)劣比較

2021-03-15 17:10JavaScript教程網(wǎng) JavaScript

這篇文章主要介紹了JS合并數(shù)組的幾種方法及優(yōu)劣比較,本文講解了concat、循環(huán)插入、reduce等方法合并數(shù)組,并對它們的優(yōu)劣做了比較,需要的朋友可以參考下

本文屬于JavaScript的基礎(chǔ)技能. 我們將學(xué)習(xí)結(jié)合/合并兩個JS數(shù)組的各種常用方法,并比較各種方法的優(yōu)缺點.

我們先來看看具體的場景:

 

復(fù)制代碼 代碼如下:

var q = [ 5, 5, 1, 9, 9, 6, 4, 5, 8];
var b = [ "tie", "mao", "csdn", "ren", "fu", "fei" ];

 

很明顯,數(shù)組 q 和 b 簡單拼接的結(jié)果是:

復(fù)制代碼 代碼如下:

[
    5, 5, 1, 9, 9, 6, 4, 5, 8,
    "tie", "mao", "csdn", "ren", "fu", "fei"
]

 

concat(..)方法

最常見的用法如下:

復(fù)制代碼 代碼如下:


var c = q.concat( b );

 

q; // [5,5,1,9,9,6,4,5,8]
b; // ["tie","mao","csdn","ren","fu","fei"];

c; // [5,5,1,9,9,6,4,5,8,"tie","mao","csdn","ren","fu","fei"]

 

如您所見, c 是一個全新的數(shù)組, 表示 q 和 b 這兩個數(shù)組的組合, 但是 q 和 b 現(xiàn)在沒用了是吧?

如果 q 數(shù)組有10000個元素, b 數(shù)組也有有10000個元素? 那么數(shù)組c現(xiàn)在就有20000個元素, 這種方式占用了2倍的內(nèi)存.

“這沒問題!”,你可能會覺得. 只要將 q 和 b 置空就行, 然后就會被垃圾回收,對嗎?問題解決了!

復(fù)制代碼 代碼如下:

q = b = null; // `q` and `b` 現(xiàn)在可以被垃圾回收了

 

額? 如果數(shù)組都很小,那自然沒問題. 但對大型的數(shù)組,或需要多次重復(fù)處理時, 內(nèi)存就被限制了, 它還需要進行優(yōu)化.

循環(huán)插入

OK, 讓我們把一個數(shù)組的內(nèi)容加入到另一個中試試,使用 Array#push() 方法:

復(fù)制代碼 代碼如下:


// 將數(shù)組 `b` 插入 `q`
for (var i=0; i < b.length; i++) {
    q.push( b[i] );
}

 

q; // [5,5,1,9,9,6,4,5,8,"tie","mao","csdn","ren","fu","fei"]

b = null;

 

現(xiàn)在, q中存放了兩個原始數(shù)組的內(nèi)容(q + b).

看樣子對內(nèi)存優(yōu)化做的不錯.

但如果 q 數(shù)組很小而 b 又很大呢? 出于內(nèi)存和速度的考慮,這時想把較小的 q 插入到 b 前面. 沒問題,只要用 unshift() 方法代替 push() 即可, 對應(yīng)的也要從大到小進行循環(huán)遍歷:

復(fù)制代碼 代碼如下:


// `q` into `b`:
for (var i=q.length-1; i >= 0; i--) {
    b.unshift( q[i] );
}

 

b; // [5,5,1,9,9,6,4,5,8,"tie","mao","csdn","ren","fu","fei"]

q = null;

 

實用技巧

悲催的是,for循環(huán)很土并且難以維護. 我們能做得更好嗎?
我們先試試 Array#reduce :

復(fù)制代碼 代碼如下:


// `b` onto `q`:
q = b.reduce( function(coll,item){
    coll.push( item );
    return coll;
}, q );

 

q; // [5,5,1,9,9,6,4,5,8,"tie","mao","csdn","ren","fu","fei"]

// or `q` into `b`:
b = q.reduceRight( function(coll,item){
    coll.unshift( item );
    return coll;
}, b );

b; // [5,5,1,9,9,6,4,5,8,"tie","mao","csdn","ren","fu","fei"]

 

Array#reduce() 和 Array#reduceRight() 很高大上,但有點笨重,而且一般人也記不住.  JS規(guī)范6 中的 => 箭頭函數(shù)(arrow-functions) 能讓代碼量大大減少, 但需要對每個數(shù)組元素執(zhí)行函數(shù)調(diào)用, 也是很渣的手段.
那么下面的代碼怎么樣呢?

復(fù)制代碼 代碼如下:


// `b` onto `q`:
q.push.apply( q, b );

 

q; // [5,5,1,9,9,6,4,5,8,"tie","mao","csdn","ren","fu","fei"]

// or `q` into `b`:
b.unshift.apply( b, q );

b; // [5,5,1,9,9,6,4,5,8,"tie","mao","csdn","ren","fu","fei"]

 

BIG更高了,是吧!? 特別是 unshift() 方法不需要像前面那樣考慮相反的順序. ES6 的展開運算符(spread operator, 加 ... 前綴)就更高端了: a.push( ...b ) 或者 b.unshift( ...a )

但是,事實上這種方法還是太樂觀了. 在這兩種情況下,不管是將 a 或 b 傳遞給 apply() 作為第二個參數(shù)(apply方式調(diào)用Function時第一個參數(shù)在內(nèi)部變成this,即context,上下文,作用域), 還是使用 ... 展開運算符的方式, 實際上數(shù)組都會被打散成為函數(shù)的 arguments .
第一個主要的問題是,占用了雙倍的內(nèi)存(當(dāng)然,是臨時的!),因為需要將數(shù)組復(fù)制到函數(shù)棧之中. 此外,不同的JS引擎有不同的實現(xiàn)算法,可能會限制了函數(shù)可以傳遞的參數(shù)數(shù)量.

如果數(shù)組添加了一百萬個元素, 那一定會超過函數(shù)棧所允許的大小, 不管是push() 或 unshift()調(diào)用. 這種方式只在幾千個元素時可用,所以必須限制其不能超過一定范圍.

注意: 你也可以試試 splice(), 肯定會發(fā)現(xiàn)他和 push(..)/unshift(..) 都是一樣的限制.

一種選擇是繼續(xù)使用這種方法,但是采用分批次處理:

復(fù)制代碼 代碼如下:

function combineInto(q,b) {
    var len = q.length;
    for (var i=0; i < len; i=i+5000) {
        // 一次處理5000條
        b.unshift.apply( b, q.slice( i, i+5000 ) );
    }
}

 

等等,我們損害了代碼的可讀性(甚至是性能!). 在我們放棄之前結(jié)束這個旅程吧.

總結(jié)

Array#concat() 是久經(jīng)考驗的方法, 用于組合兩個(或多個)數(shù)組. 但他創(chuàng)建了一個新的數(shù)組,而不是修改現(xiàn)有的一個.

有很多變通的手法,但他們都有不同的優(yōu)缺點,需要根據(jù)實際情況來選擇.

上面列出了各種 優(yōu)點/缺點,也許最好的(包括沒有列出的)方法是 reduce(..) 和 reduceRight(..)

無論你選擇什么,都應(yīng)該批判性地思考你的數(shù)組合并策略,而不是把它當(dāng)作理所當(dāng)然的事情.

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲视频一区在线播放 | 中文字幕在线观看一区二区 | 一区二区三区亚洲 | 一区二区三区高清 | 日韩精品一区二区三区在线播放 | 一区二区三区四区在线 | 天堂在线www| 日韩精品一区二 | 日韩超碰在线观看 | 精品av| 免费成人在线网站 | 国产一区在线视频 | 欧美一区二区久久 | 亚洲免费成人在线 | www.午夜 | 国产在线一区二区 | 国产丝袜一区 | 狠狠操综合网 | 麻豆一区 | 欧美日韩国产免费 | 欧美精品一区二区三区在线四季 | 色综合久 | 97国产精品视频 | 欧美日韩一级视频 | 久久综合一区二区 | 日韩电影一区 | 国产黄色小视频 | 国产成人精品一区二区 | 久久99精品国产.久久久久 | 久久久免费看 | 亚洲高清视频在线观看 | 午夜国产精品成人 | 欧美高清免费 | 99久久亚洲一区二区三区青草 | 久久精品成人 | 黄色免费视频 | 在线中文字幕视频 | 国产精品久久久久久久久 | 在线免费色视频 | 国产精品成人国产乱一区 | 亚洲激情在线 |