我在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组)。怎么做?谢谢!
答案 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
答案 1 :(得分: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]);
}
这个解决方案的优点是它不会一次构建一个元素,而是一次构建一个元素。
答案 2 :(得分: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;
}, [ [] ]);
从具有一个(空)分区的分区列表开始,这只是检查最后一个分区中的最后一个月,看它是否小于当前正在检查的月份。如果是这样(或者如果我们是第一个),我们将月份添加到分区。如果没有,则启动一个新分区,仅包含当前月份。