2012-07-06 66 views
3

的JavaScript我填通過傳統的方式排列元素,如:把多個元素的JavaScript Array

myArray[12] = 123; 
myArray[13] = 432; 
myArray[14] = 233; 
myArray[15] = 98; 

是否有可能通過一個命令更快地做到這一點?

例如把數字[123, 432, 233, 98]myArray[12-15] ......不知何故?不是一個一個。


而如何可以優化這種情景:

newArray[12] = oldArray[30]; 
newArray[13] = oldArray[31]; 
newArray[14] = oldArray[32]; 
newArray[15] = oldArray[33]; 

當n個元素(4在上面的例子)接着各從一個陣列其他需要被移動到另一個數組?

請指教。

+0

值從哪裏來? – RobB 2012-07-06 19:41:58

回答

7
var myArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
       12, 13, 14, 15, 16, 17, 18, 19, 20]; 
myArray.splice(12, 4, 123, 432, 233, 98); 

// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
// 123, 432, 233, 98, 16, 17, 18, 19, 20] 

splice第一個參數是開始與索引,第二個是元素刪除的數目,其餘的是元件插入。因此,如果您插入的號碼與刪除的號碼相同,則最終會替換它們。

如果你想這來自於另一個數組,你可以試試這個,雖然它並不像乾淨:

var oldArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
       12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 
       22, 23, 24, 25, 26, 27, 28, 29, 123, 
       432, 233, 98, 34, 35] 
var newArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
       12, 13, 14, 15, 16, 17, 18, 19, 20]; 

[].splice.apply(newArray, [12, 4].concat(oldArray.slice(30, 30 + 4))); 

// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
// 123, 432, 233, 98, 16, 17, 18, 19, 20] 

,這大概比PointedEars suggestion效率較低,但它很簡單,很可能服務於許多用例。

+0

的地方再次太晚了!:-) – 2012-07-06 19:54:07

1

您可以使用push功能:

myarray.push([123, 432, 233, 98]); 

到整個陣列添加到您的陣列或添加單個項目:

myarray.push(123, 432, 233, 98); 

要添加到具體位置,你將需要使用splice()功能。

文檔:

+1

@Blaster將一個數組推到一個數組上並不會達到你想要的效果 – 2012-07-06 19:46:23

+0

@Ωmega:我還添加了'splice'函數,它允許你把項目放在指定的位置。 – Blaster 2012-07-06 19:46:59

4

你能來最接近的是使用splice設置輸入位置。

第一個參數是索引處開始,第二個參數是多少項刪除,接下來的參數是值....

下面是一些輸出我得到亂搞一個控制檯。

myArray = new Array(15) 
myArray.splice(12, 4, 123, 432, 223, 98) 
myArray.forEach(function(v, i){console.log(v, i)}) 
123 12 
432 13 
223 14 
98 15 
undefined 
myArray[12] 
123 
myArray[13] 
432 
myArray[14] 
223 
myArray[15] 
98 

當然,這具有若干缺陷:不能傳遞要插入值的數組,該數組需要足夠大(即,你不能在索引12插入,除非陣列是至少12長)。

爲了將一個數組中的一組索引中的值傳遞給另一個數組中的另一組索引,我認爲你必須循環。 splice需要單獨添加值,而不是數組。你當然可以用循環編寫一個單一的方法,並重用它。

+0

好主意,但'Array.prototype.splice()'會*插入*元素,*不*替換現有的元素。要解決這個問題,你將不得不刪除儘可能多的元素,因爲你插入。我認爲這裏最好的解決方案是使用一個循環,但如果ECMAScript實現像Python那樣支持片替換,那將是很好的。也許在和諧(ES 6)。 – PointedEars 2012-07-06 19:48:53

+0

@musa thanx的編輯,我去那裏自己... – hvgotcodes 2012-07-06 19:49:52

+0

只是,你是SOL,你必須循環。 – hvgotcodes 2012-07-06 20:01:23

0

您應該使用.concat(),如下所示:

myArray = myArray.concat([123, 432, 233, 98]) 

或使用。推()如下:

myArray.push(123,432,233,98) 
+0

與@hvgotcodes一起去,拼接就是在 – 2012-07-06 19:47:13

2

Array.prototype.push()Array.prototype.splice()是不錯的想法,但push()總是附加到該陣列(即,從由length屬性指定的索引開始)的端部,和splice()需要你刪除一樣多的元素你之前插入你插入(這是兩倍昂貴,因爲它需要)。

因此,你應該使用一個循環:

for (var i = 12; i < 16; ++i) 
{ 
    _new[i] = old[i + 18]; 
} 

new是一個關鍵字,從而保留;您的示例代碼是不可執行的我已經使用_new這裏來解決這一點。)

這可以概括爲:

function putValues(array1, array2, start1, start2, num) 
{ 
    if (typeof start1 == "undefined") start1 = 0; 
    if (typeof start2 == "undefined") start2 = 0; 
    var max = (typeof num == "undefined") ? array2.length : start2 + num; 

    for (var i = start1, j = start2; j < max; ++i, ++j) 
    { 
    array1[i] = array2[j]; 
    } 
} 

putValues(newArray, oldArray, 12, 30, 4); 

更復雜的概括是可以想象的,例如傳遞一個或兩個索引數組,所以t指數不一定要連續。

(抵制誘惑,使這個Array.prototype的方法,除非你想有for有效地迭代時使用Object.prototype.hasOwnProperty() - 在一個無序的方式在稀疏矩陣in

下一次,嘗試東西首先是

+0

'splice'不需要你刪除任何特定數量的元素。如果你想以這種方式替換它們中的一組,你應該刪除該號碼。但這似乎不是一個限制。 – 2012-07-06 20:11:45

+0

@ScottSauyet再次閱讀問題。 – PointedEars 2012-07-06 20:26:56

+0

並感謝downvotes。僅僅因爲你不理解或不喜歡答案,這並不意味着它是錯誤的或沒有用的。 – PointedEars 2012-07-06 20:39:04