2014-01-24 62 views
-2

動態切片陣列我有一個JavaScript一個月陣列,例如:如何在Javascript

2012/09/01,2012/10/01,2012/11/01,2012/12/01,2013/01/01,2013/02/01,2013/03/01, 
2012/09/01,2012/10/01,2012/11/01,2012/12/01,2013/01/01,2013/02/01,2013/03/01,2013/04/01, 
2012/09/01,2012/10/01,2012/11/01,2012/12/01 

我想什麼分開了數組是:

if (monthArray[i] > monthArray[i + 1]) 
    // slice the Array. 

所以,上面的例子,我應該得到3個新的陣列。它們是:

Array1: 2012/09/01,2012/10/01,2012/11/01,2012/12/01,2013/01/01,2013/02/01,2013/03/01 

Array2: 2012/09/01,2012/10/01,2012/11/01,2012/12/01,2013/01/01,2013/02/01,2013/03/01,2013/04/01 

Array3:2012/09/01,2012/10/01,2012/11/01,2012/12/01 

我知道這是很容易做到這一點,如果我們知道具體的長度,我的問題是,如何做到這一點,如果我們動態地一個月拿陣列(它可以分爲n組)。怎麼做?謝謝!

+3

你能改寫你的問題嗎?我不明白你想做什麼。 – Ginden

+0

您正在使用什麼算法來選擇將要放入每個新陣列的元素數量?確定哪些元素進入哪個陣列的標準是什麼? – crush

+0

你是說你想從日期數組中抽出所有的月份嗎? –

回答

1

因此,假如你想用一個數組的數組就結了,然後就去做一個for循環...

var result = []; //this will contain multiple arrays once finished 
var currentArray = []; 

for (var i = 0; i < monthArray.length; i++) { 
    currentArray.push(monthArray[i]); 
    if (i < monthArray.length - 1 && monthArray[i] > monthArray[i + 1]) { 
     result.push(currentArray); 
     currentArray = []; 
    } 
} 
result.push(currentArray); 

//result[0] is Array1 
//result[1] is Array2 
//result[2] is Array3 

Here is a working example

1

我不知道的比任何更好的辦法遍歷數組在建立自己的切片:

var arr = ['2012/09/01','2012/10/01','2012/11/01','2012/12/01','2013/01/01','2013/02/01','2013/03/01','2012/09/01','2012/10/01','2012/11/01','2012/12/01','2013/01/01','2013/02/01','2013/03/01','2013/04/01','2012/09/01','2012/10/01','2012/11/01','2012/12/01']; 

var slices = []; 
var start = 0; 
for (var i=0; i<arr.length; i++) { 
    if (check(arr, i)) { 
    slices.push(arr.slice(start, i+1)); 
    start = i+1; 
    } 
} 

function check(array, index) { 
    if (index+1 === array.length) return true; 
    return Date.parse(array[index]) > Date.parse(array[index+1]); 
} 

該解決方案,它不建立切片一次一個元素的優勢,而是建立其中的片段一次。

1

假設你想要一個陣列的陣列作爲一個結果,你可以用.reduce做到這一點:

var partitions = dateList.reduce(function(rv, month) { 
    var partition = rv[rv.length - 1], prevMonth = partition[partition.length - 1]; 
    if (!prevMonth || prevMonth < month) 
    partition.push(month); 
    else 
    rv.push([month]); 
    return rv; 
}, [ [] ]); 

從分區列表用一個(空)分區開始,這只是檢查的最後一個月在最後一個分區中查看它是否小於當前正在檢查的月份。如果是(或者如果我們是第一個),我們將該月添加到該分區。如果不是,則啓動一個新分區,僅包含當前月份。