基于值拆分数组

8
很久以前我就不再写JavaScript代码了,现在有些生疏了。我需要将这样的数组进行拆分:
Object ( [0] => 2013-04-12 [1] => text [2] => text [3] => text [4] => text [5] => 2013-04-11 [6] => text [7] => text [8] => text [9] => text [10] => text [11] => text [12] => 2013-04-10 [13] => text [14] => text [15] => text [16] => text [17] => 2013-04-09 [18] => text [19] => text [20] => text )
转换为JSON对象或数组,其中索引0始终是日期:
Object0 ( [0] => 2013-04-12 [1] => text [2] => text [3] => text [4] => text ) Object1 ( [0] => 2013-04-11 [1] => text [2] => text [3] => text [4] => text [5] => text [6] => text )
Object2 ( [0] => 2013-04-10 [1] => text [2] => text [3] => text [4] => text )
Object3 ( [0] => 2013-04-09 [1] => text [2] => text [3] => text )
因此,我只能使用值来确定每个新数组,这些数组的大小可能不同。感谢您的帮助。
更新:抱歉我没有在最初的问题中发布我的代码,因为我写得太烂了(而且我非常羞愧)。下面是我最终使用的代码,感谢Bangerang的解决方案。感谢大家的帮助和贡献。
var events = [];
var result = [];
var j = 0;
for (var i = 0; i < tableData.length; i++){
    if (/^(\d{4})-(\d{2})-(\d{2})$/.test(tableData[i])){ //Returning true if it's just numbers
        j = j + 1;
        events[j] = [];
        events[j].push(tableData[i]);
        result.push(events[j]);
    } else {
        events[j].push(tableData[i]);
    }
}

// Then I write the json message which will be eval to use with FullCalendar.
var json_events = '[';
for (var i = 1; i <= events.length; i++){
    if (typeof events[i] !== 'undefined' && events[i].length > 0) {
        for (var j = 0; j < events[i].length; j++){
            if(/@/.test(events[i][j])){

                json_events += '{"start":"' + events[i][0] + '",';
                json_events += '"textColor":"black",';

                var tmp = events[i][j].split("@");
                json_events += '"backgroundColor":"' + tmp[0] + '",';

                var text_pattern = new RegExp(/<b>([a-z_]+)<\/b>(.+)/);
                var title_desc = text_pattern.exec(tmp[1]);                            
                json_events += '"title":"' + title_desc[1] + '",';
                json_events += '"description":"' + title_desc[0] + '"';
                json_events += '},';
            }
        }
    }
}
json_events += ']';
json_events = json_events.replace("},]","}]"); 

/^(\d{4})-(\d{2})-(\d{2})$/在你的示例中不匹配日期格式。日期是以字符串还是数字存储的? - Kijewski
抱歉,是的,你说得对,我在此期间更改了日期格式(发现了RegExp和exec())。我会更新问题以反映我的更改。 - Jonas
请不要在标题中加入“已解决”。Stackoverflow会使用颜色编码来标识已有被采纳的答案的问题。 - Kijewski
今天可以使用reduce代替:基于值的数组分割 - Sebastian Simon
3个回答

7
假设日期是唯一只包含数字的元素,您可以尝试以下操作:
var object = [];
var result = [];
for (var i = 0; i < objects.length; i++){
    if (/^\d+$/.test(objects[i])){ //Returning true if it's just numbers
        object = []
        object.push(objects[i]);
        result.push(object);
    }else {
        object.push(objects[i]);
    }
}

3
基本上,
result = []

sourceArray.forEach(function(element) {
    if(element looks like a date)
        result.push([])
    result[result.length - 1].push(element)
})

如果您想获得更多帮助,请发布您的实际代码;)


1

目前,这项工作并不是很复杂。您只需遍历数组,并在遇到日期格式单元格时创建一个新数组。在此之前,您可以用非日期遇到的值填充先前创建的数组。我假设数组中所有内容都是字符串,因此我们将使用简单的正则表达式来确定日期格式^[0-9]{8}$

var result = new Array();
var date_format = /^[0-9]{8}$/;

for (var k in big_array) {
    // if date format, add a new array
    if (date_format.test(result[k])) {
        result.push(new Array());
    }
    // finally, push the value in the last array
    result[result.length-1].push(big_array[k]);
}

这是一个非常简单的算法练习,所以我建议多练习编写代码,避免下次再提问,或者至少展示你尝试过什么。
最好的问候。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接