Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Splitting array based on values

It's been a long time since I had to work on some javascript code and I'm a lot rusty.

I need to split an array like this:

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
)

into json objects or arrays where index 0 is always the date:

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
)

So as you can see, I can only use the value to figure out each new array, which can be of different sizes.

Thanks for any help.

UPDATE Sorry I didn't publish my code in the initial question because what I had written was way too crap (and I was very ashamed). Here the code I used in the end thanks to the solution from Bangerang. Thanks everyone for your help and contributions.

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("},]","}]"); 
like image 663
Jonas Avatar asked Apr 15 '13 14:04

Jonas


People also ask

How do you split an array of elements?

Example-2: This example uses the splice() method to split the array into chunks of array. This method removes the items from the original array. This method can be used repeatedly to split array of any size. | Split array into chunks.

How do you split an array into two parts?

To divide an array into two, we need at least three array variables. We shall take an array with continuous numbers and then shall store the values of it into two different variables based on even and odd values.

Can you use split on an array?

Definition and UsageThe split() method splits a string into an array of substrings. The split() method returns the new array. The split() method does not change the original string.

How do you split an array in Python?

Use the array_split() method, pass in the array you want to split and the number of splits you want to do.


3 Answers

Assuming that the date's is the only ones with just numbers in it you can try this:

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]);
    }
}
like image 92
bangerang Avatar answered Sep 17 '22 22:09

bangerang


basically,

result = []

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

post your actual code if you want more ;)

like image 30
georg Avatar answered Sep 18 '22 22:09

georg


Currently, the work is not really complicated. You just have to go through your array, and create a new one when you encounter a date formatted cell. Until then, you fill the previous created array with the non-date encountered values. I suppose that all of the array content are string, so we will determine here the date format using a simple regex ^[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]);
}

This is a really simple algorithm exercise, so i would recommend to practice more the code's writing and avoid asking next time, or at least show what you tried.

Best regards.

like image 36
Brugnar Avatar answered Sep 20 '22 22:09

Brugnar