亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JavaScript中合并數組的N種方法

2019-11-20 14:08:27
字體:
來源:轉載
供稿:網友

這是一篇簡單的文章,關于JavaScript數組使用的一些技巧。我們將使用不同的方法結合/合并兩個JS數組,以及討論每個方法的優點/缺點。

讓我們先考慮下面這情況:

復制代碼 代碼如下:

var a = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ];
var b = [ "foo", "bar", "baz", "bam", "bun", "fun" ];

很顯然最簡單的結合結果應該是:
復制代碼 代碼如下:

[
   1, 2, 3, 4, 5, 6, 7, 8, 9,
   "foo", "bar", "baz", "bam" "bun", "fun"
]

concat(..)

這是最常見的做法:

復制代碼 代碼如下:

var c = a.concat( b );
a; // [1,2,3,4,5,6,7,8,9]
b; // ["foo","bar","baz","bam","bun","fun"]
c; // [1,2,3,4,5,6,7,8,9,"foo","bar","baz","bam","bun","fun"]

正如你所看到的,C是一個全新的數組,表示a和b兩個數組的組合,并讓A和B不變。簡單吧?

但如果a有10,000個元素,而b也有一萬個元素? C就會有2萬個元素,所以a和b的內內存使用就會翻倍。

“沒問題!”,你說。讓它們被垃圾回收,把A和B設置為null,問題解決了!

復制代碼 代碼如下:

a = b = null; // 'a'和'b'就被回收了

呵呵。對于只有幾個元素的小數組,這沒啥問題。但對于大數組,或者在內存有限的系統中需要經常重復這個過程,它其實還有很多改進的地方。

循環插入

好吧,讓我們將一個數組的內容復制到另一個,使用: Array#push(..)

復制代碼 代碼如下:

// `b` onto `a`
for (var i=0; i < b.length; i++) {
    a.push( b[i] );
}
a; // [1,2,3,4,5,6,7,8,9,"foo","bar","baz","bam","bun","fun"]
b = null;

現在,數組a有了數組b的內容。

似乎有更好的內存占用。

但如果a數組比較???出于內存和速度的原因,你可能要把更小的a放到b的前面,。沒問題,只需將push(..)換成unshift(..)即可:

復制代碼 代碼如下:

// `a` into `b`:
for (var i=a.length-1; i >= 0; i--) {
    b.unshift( a[i] );
}
b; // [1,2,3,4,5,6,7,8,9,"foo","bar","baz","bam","bun","fun"]

功能技巧

不過for循環確實比較丑,而且不好維護。我們可以做的更好嗎?

這是我們的第一次嘗試,使用Array#reduce:

復制代碼 代碼如下:

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

a; // [1,2,3,4,5,6,7,8,9,"foo","bar","baz","bam","bun","fun"]

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

b; // [1,2,3,4,5,6,7,8,9,"foo","bar","baz","bam","bun","fun"]

Array#reduce(..) 和 Array#reduceRight(..)是不錯的,但他們是一點點笨拙。 ES6=>的箭頭函數將減少一些代碼量,但它仍然需要一個函數,每個元素都需要調用一次,不是很完美。

那這個怎么樣:

復制代碼 代碼如下:

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

a; // [1,2,3,4,5,6,7,8,9,"foo","bar","baz","bam","bun","fun"]

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

b; // [1,2,3,4,5,6,7,8,9,"foo","bar","baz","bam","bun","fun"]

這是一個要好很多吧?特別是因為 unshift(..)方法在這里并不需要擔心前面的反向排序。 ES6的spead操作會更漂亮: a.push( ...b ) 或 b.unshift( ...a

數組最大長度限制

第一個主要的問題是,內存使用量增長了一倍(當然只是暫時的?。┍蛔芳觾热莼旧鲜峭ㄟ^函數調用將元素復制到堆棧中。此外,不同的JS引擎都有拷貝數據長度的限制。
所以,如果數組有一百萬個元素,你肯定會超出了push(...)或unshift(...)允許調用堆棧的限制。唉,處理幾千個元素它會做得很好,但你必須要小心,不能超過合理的長度限值。

注意: 你可以嘗試一下splice(...),它跟push(...)和unshift(...)一樣都有這種問題。

有一種方法可以避免這種最大長度限制。

復制代碼 代碼如下:

function combineInto(a,b) {
    var len = a.length;
    for (var i=0; i < len; i=i+5000) {
        b.unshift.apply( b, a.slice( i, i+5000 ) );
    }
}

等一下,我們的可讀性倒退了。 就這樣吧,可能會越改越差,呵。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日av在线播放中文不卡| 日韩在线观看免费| 欧美日韩国产一区二区三区| 性欧美办公室18xxxxhd| 成人国产精品av| 国产视频久久久| 日韩风俗一区 二区| 久久琪琪电影院| 色偷偷88888欧美精品久久久| 奇米四色中文综合久久| 日韩一区二区精品视频| 久久久久久久久国产精品| 亚洲精品午夜精品| 亚洲国产精品嫩草影院久久| 国产精品久久久久久久久免费| 久久久久久久久久亚洲| 91精品久久久久久久久不口人| 欧美精品videos另类日本| 2019中文字幕全在线观看| 亚洲欧洲一区二区三区久久| 欧美日韩成人免费| 97在线免费观看视频| 国产亚洲a∨片在线观看| 国产日韩在线免费| 日韩国产精品视频| 亚洲四色影视在线观看| 国产精品久久久久久久久久小说| 亚洲国产高清自拍| 国产精品久久中文| 欧美精品在线免费观看| 久久视频在线视频| 社区色欧美激情 | 亚洲一区二区三区成人在线视频精品| 国产欧美精品在线播放| 欧美自拍大量在线观看| 亚洲男人天堂古典| 欧美黄色三级网站| 亚洲综合在线中文字幕| 性视频1819p久久| www.久久撸.com| 亚洲精品国产精品久久清纯直播| 日韩av影片在线观看| 亚洲国产成人在线视频| 国产一区二区欧美日韩| 91成人在线视频| 人人做人人澡人人爽欧美| 亚洲国内精品视频| 中文字幕欧美日韩精品| 亚洲成色777777在线观看影院| 亚洲精品少妇网址| 国产99久久精品一区二区| 久久精品视频在线播放| 亚洲最大的免费| 欧美又大又硬又粗bbbbb| 日韩视频在线免费| 懂色aⅴ精品一区二区三区蜜月| 日本欧美黄网站| 久久国产精品99国产精| 国色天香2019中文字幕在线观看| 免费91麻豆精品国产自产在线观看| 欧美精品一本久久男人的天堂| 亚洲一区制服诱惑| 亚洲精品色婷婷福利天堂| 91系列在线播放| 国产91精品视频在线观看| 亚洲成人性视频| 亚洲国产精品成人va在线观看| 成人国产精品久久久久久亚洲| 久久手机免费视频| 国产精品亚洲精品| 日韩在线视频网站| 国产精品色婷婷视频| 高跟丝袜欧美一区| 欧美视频一区二区三区…| 久久精品视频网站| 日韩欧美大尺度| 日韩中文av在线| 欧美激情精品久久久久久久变态| 18久久久久久| 96精品久久久久中文字幕| 在线观看日韩www视频免费| 国产欧美日韩免费| 国产精品自产拍在线观看| 在线色欧美三级视频| 亚洲成人黄色在线| 97免费中文视频在线观看| 日韩av中文字幕在线免费观看| 亚洲网在线观看| 亚洲激情中文字幕| 欧美性视频在线| 欧美高清性猛交| 日韩中文在线视频| 国产91精品黑色丝袜高跟鞋| 精品magnet| 欧美性色视频在线| 亚洲国产精品va在线看黑人动漫| 成人午夜在线视频一区| 国产98色在线| 热久久这里只有精品| 亚洲另类图片色| 国产精品久久久久久久久久小说| 国产91精品网站| 久久精品国产成人| 亚洲欧美日韩国产中文| 日韩中文字幕在线免费观看| 成人国产精品av| 亚洲一级一级97网| 亚洲人成欧美中文字幕| 热久久视久久精品18亚洲精品| 黄网动漫久久久| 国产精品热视频| 精品国内自产拍在线观看| 国产主播精品在线| 色在人av网站天堂精品| 国产精品激情av在线播放| 美女久久久久久久久久久| 精品亚洲一区二区三区| 国产精品福利网站| 亚洲人成电影网站色xx| 国产丝袜一区视频在线观看| 久久精品一区中文字幕| 最近2019中文字幕mv免费看| 国产精品久久激情| 久久亚洲春色中文字幕| 日韩av在线电影网| 亚洲最大成人在线| 欧美精品福利在线| 亚洲欧美另类在线观看| 亚洲欧美一区二区三区情侣bbw| 欧美人在线观看| 亚洲人成电影网站色…| 亚洲色图狂野欧美| 欧洲成人午夜免费大片| 国产精品一区久久| 奇门遁甲1982国语版免费观看高清| 国产色综合天天综合网| 国产精品久久久久久亚洲调教| 国产日韩综合一区二区性色av| 欧美激情a在线| 91国内产香蕉| 亚洲乱码一区二区| 国产亚洲一区精品| 91av在线免费观看视频| 免费91麻豆精品国产自产在线观看| 亚洲欧美在线第一页| 亚洲一区二区三区视频| 久久久女女女女999久久| 亚洲第一区中文字幕| 8x海外华人永久免费日韩内陆视频| 精品日韩视频在线观看| 欧美二区在线播放| 97在线精品视频| 欧美有码在线观看视频| 欧洲永久精品大片ww免费漫画| 国产精品网址在线| 国产精品久久中文| 亚洲精品国精品久久99热| 欧美尺度大的性做爰视频| 影音先锋欧美在线资源| 91九色单男在线观看| 日本久久久a级免费| 亚洲午夜精品久久久久久性色| 欧美在线影院在线视频| 成人黄色av播放免费|