如何在Javascript中动态切片数组

时间:2014-01-24 16:13:45

标签: javascript arrays

我在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 个答案:

答案 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 :(得分: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;
}, [ [] ]);

从具有一个(空)分区的分区列表开始,这只是检查最后一个分区中的最后一个月,看它是否小于当前正在检查的月份。如果是这样(或者如果我们是第一个),我们将月份添加到分区。如果没有,则启动一个新分区,仅包含当前月份。