2013-04-15 259 views
2

我已经很长一段时间了,因为我必须处理一些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 
) 

因此,大家可以看到,我只能用计算出每个新阵列的值,其大小可以不同。

感谢您的任何帮助。

UPDATE 对不起,我没有发表我的代码在最初的问题,因为我所写的是太垃圾(和我很惭愧)。 在这里我最终使用的代码感谢来自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("},]","}]"); 
+0

'/ ^(\ d {4}) - (\ d {2}) - (\ d {2})$ /'与您的示例中的日期格式不匹配。日期是以字符串还是数字形式存储的? – kay

+0

对不起,你是对的,我在此期间改变了日期格式(发现RegExp和exec())。我会更新这个问题以反映我的变化。 – Jonas

+0

请不要在标题中加入“解决”。 Stackoverflow用接受的答案对问题进行颜色编码。 – kay

回答

4

假设日期的是唯一的与它只是数字,你可以试试这个:

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]); 
    } 
} 
2

基本上,

result = [] 

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

发布您的实际代码,如果你想要更多;)

0

目前,这项工作是不是真的很复杂。你只需要通过你的数组,当你遇到一个日期格式的单元格时创建一个新的数组。在此之前,您将使用非日期遇到的值填充先前创建的数组。我想,所有的数组内容都是字符串,所以我们将在这里使用一个简单的正则表达式^[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]); 
} 

这是一个非常简单的算法锻炼确定日期格式,因此,我建议要多练习代码的编写和避免下次问,或至少显示你的尝试。

此致敬礼。