2015-01-16 29 views
1

我有這個數組:如何在自定義模式中切片數組?

var x = [1,2,3,4,5,"a","b","c",9,10]; 

我想這片陣列分爲以下模式:

var x = [[1,2,3],[2,3,4],[3,4,5],[4,5,"a"],[5,"a","b"],["a","b","c"],["b","c",9],["c",9,10]]; 

我用下面的代碼,並能夠得到[[1,2,3],[4,5,"a"],["b","c",9],[10,11,12]]。但它不適合我。我需要得到上面的模式。

var stream = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; 
var x = ["a", "b", "c"]; 
var ad_time = 6; 
var result = []; 

var ad_index = stream.indexOf(ad_time); 

if (~ad_index) { 
    for (var i = 0; i < x.length; i++) { 
     stream[ad_index + i] = x[i]; 
    } 
} 

while (stream.length > 0) { 
    var chunk = stream.splice(0, 3); 
    result.push(chunk); 

} 
console.log(JSON.stringify(result)); 

非常感謝!

回答

2

你可以用一個簡單的循環for實現它:

var x = [1,2,3,4,5,"a","b","c",9,10]; 
 
var result = []; 
 

 
for (var i = 0, il = x.length - 2; i < il; i++) { 
 
    result.push([x[i], x[i + 1], x[i + 2]]); 
 
} 
 

 
console.log(result);

編輯:Array.slice()更優雅,但它是慢得多。在Chrome上,根據this測試,速度會降低80% - 85%。如果您不需要擔心性能,請選擇您喜歡的任何一個。例如,如果您需要從陣列中分割8個元素,則使用x.slice(i + 8)[x[i], x[i + 1], x[i + 2], x[i + 3], ...]更易於寫入和讀取。但是,如果性能很重要,那麼直接訪問可能是更好的選擇。

+0

你是天才...謝謝!但是..我想丹尼爾的解決方案看起來更優雅? – scaryguy

+0

@scaryguy是的,'Array.slice()'更優雅,但它比直接訪問慢得多。看到這個測試:http://jsperf.com/direct-access-vs-slice –

+0

由於這種表現差異,我接受你的回答格戈。你可以添加關於性能的這個筆記給你的答案嗎?所有人都不會看到評論。謝謝! – scaryguy

3

此代碼應該這樣做:

var x = [1,2,3,4,5,"a","b","c",9,10]; 

var new_array = []; 

for (var i = 0; i < x.length - 2; i++) { 
    new_array.push(x.slice(i, i + 3)); 
} 
+0

哇!你能解釋一下嗎?你如何找到這個解決方案? – scaryguy

+0

@scaryguy這是相當簡單的。除了最後兩個元素之外的所有元素,因爲您想要三個組。如果你想要4組,你需要從數組長度中減去3。在每個過程中,根據長度爲「3」的索引在新數組中存儲原始數組的複製片段。 – Mouser

+0

丹尼爾,感謝您的回答,但請參閱Gergo在他的評論中給出的鏈接。這個解決方案比他的解決方案慢了近7倍。雖然你的回答看起來更加優雅,但爲了吸引其他讀者的注意力,我接受了他的回答。再次感謝。 – scaryguy

相關問題