亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在不創建新數組的情況下用另一個數組擴展現有的JavaScript數組

如何在不創建新數組的情況下用另一個數組擴展現有的JavaScript數組

翻閱古今 2019-07-08 15:07:49
如何在不創建新數組的情況下用另一個數組擴展現有的JavaScript數組似乎沒有一種方法可以用另一個數組擴展現有的JavaScript數組,即模擬Python的extend方法。我要做到以下幾點:>>> a = [1, 2][1, 2]>>> b = [3, 4, 5][3, 4, 5]>>> SOMETHING HERE>>> a[1, 2, 3, 4, 5]我知道有一個a.concat(b)方法,但是它創建一個新數組,而不是簡單地擴展第一個數組。我想要一種高效的算法a明顯大于b(即不復制的a).注:這是不是復制品如何將某物附加到數組中?-此處的目標是將一個數組的全部內容添加到另一個數組中,然后“就位”,即不復制擴展數組的所有元素。
查看完整描述

3 回答

?
慕桂英3389331

TA貢獻2036條經驗 獲得超8個贊

這個.push方法可以使用多個參數。您可以使用擴展算子將第二個數組的所有元素作為參數傳遞給.push:

>>> a.push(...b)

如果瀏覽器不支持ECMAScript 6,則可以使用.apply相反:

>>> a.push.apply(a, b)

或者,如果你覺得更清楚的話:

>>> Array.prototype.push.apply(a,b)

請注意,如果數組出現堆棧溢出錯誤,所有這些解決方案都將失敗。b太長了(根據瀏覽器的不同,大約有10萬個元素開始出現問題)。如果你不能保證b很短,您應該使用另一個答案中描述的基于循環的標準技術。


查看完整回答
反對 回復 2019-07-08
?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

更好的答案是我的新答案a.push(...b)..不要再投這個票了,因為它從來沒有真正回答過這個問題,但這是一次2015年的黑客攻擊,圍繞著谷歌的第一次攻擊:)


對于那些簡單地搜索“JavaScript數組擴展”并來到這里的人,您可以很好地使用Array.concat.

var a = [1, 2, 3];a = a.concat([5, 4, 3]);

CONAT將返回一個新數組的副本,這是線程啟動程序不想要的。但你可能不在乎(當然,對于大多數的用途,這都會很好)。


也有一些不錯的ECMAScript 6糖用于這個形式的擴展操作符:

const a = [1, 2, 3];const b = [...a, 5, 4, 3];

(它也是復制的。)


查看完整回答
反對 回復 2019-07-08
?
慕沐林林

TA貢獻2016條經驗 獲得超9個贊

你應該使用基于循環的技術。此頁面上基于以下方法的其他答案:.apply對于大型數組,可能會失敗。

一個相當簡潔的基于循環的實現是:

Array.prototype.extend = function (other_array) {
    /* You should include a test to check whether other_array really is an array */
    other_array.forEach(function(v) {this.push(v)}, this);}

然后,您可以執行以下操作:

var a = [1,2,3];var b = [5,4,3];a.extend(b);

DzinX的回答(使用push.application)和其他.apply當我們所附加的數組很大時,基于方法就會失敗(測試表明,對我來說,Chrome中的>15萬個條目,Firefox中的>500萬個條目)。您可以看到這個錯誤發生在這個jsperf.

當調用‘Function.Prototype.Apply’時,會出現錯誤,因為調用堆棧的大小超過了‘Function.Prototype.Apply’,而第二個參數(MDN有一個關于使用功能.原型.應用-見題為“應用和內置功能”的一節)。

若要與此頁上的其他答案進行速度比較,請查看這個jsperf(感謝EaterOfCode)?;谘h的實現在速度上與使用Array.push.apply,但往往比Array.slice.apply.

有趣的是,如果所附加的數組是稀疏的,則forEach基于以上的方法可以充分利用稀疏性,優于傳統的方法。.apply基于方法這個jsperf如果你想自己測試的話。

順便說一句,不要被誘惑(就像我一樣!)進一步縮短forEach實現如下:

Array.prototype.extend = function (array) {
    array.forEach(this.push, this);}

因為這會產生垃圾結果!為什么?因為Array.prototype.forEach為它調用的函數提供三個參數-它們是:(元素_值、元素_索引、源_數組)。的每一次迭代,所有這些都將被推入到第一個數組中。forEach如果你用“forEach(這個,推,這個)”!


查看完整回答
反對 回復 2019-07-08
  • 3 回答
  • 0 關注
  • 403 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號