Friday, February 17, 2012

Splitting a CSV into an object with javascript/jquery


I have an ordered array which looks like this:-




[-0.0020057306590257895, 50, 0.09598853868194843, 50, 0.19398280802292264, 49.99999999999999, 0.2919770773638969, 50]



What I would like to do is the following:



  • Take each 'odd' entry and make it the 'key index in an object, which can be achieved by rounding the value and multiplying by 10 e.g. (Math.round(-0.0020057306590257895 * 10) should be index 0 and Math.round(0.09598853868194843 * 10) should be index 1 etc)

  • Take the 'even' values and make them the corresponding values in the object.



So...



The above CSV file should return the following object:-




{
0: 50,
1: 50,
2: 49.99999999999999,
3: 50
}



Does anyone one know how I can parse this CSV to produce the required array using either jQuery or plain javascript?

3 comments:

  1. I'm going to assume you've done something to read the CSV file into a string since you said in the comments you tried using .split(",").

    var csv = "-0.0020057306590257895, 50, 0.09598853868194843, 50, 0.19398280802292264, 49.99999999999999, 0.2919770773638969, 50";
    var arr = csv.split(",");
    var obj = {};
    for (var i = 0; i < arr.length - 1; i += 2) {
    obj[Math.round(arr[i] * 10)] = arr[i + 1];
    }


    You should probably check that there are an even number of elements in the array first with something like if (arr.length % 2 == 0).

    The things you should walk away with are:


    {} curly braces are used to define an object, a pair of empty braces means the same thing as new Object() but using the braces is recommended.
    [] square brackets can be used define an array or address both the elements of an array by their index (like arr[0]) and the properties of an object by their key (like obj['name']).

    ReplyDelete
  2. var arr = "-0.0020057306590257895, 50, 0.09598853868194843, 50, 0.19398280802292264, 49.99999999999999, 0.2919770773638969, 50".split(",");
    var obj = {};

    for (index = 0; index < arr.length - 1; index += 2) {
    var key = Math.round(parseFloat(arr[index]) * 10);
    var value = Math.round(parseFloat(arr[index + 1]) * 10);
    obj[key.toString()] = value.toString();
    }


    To get the value:

    var keyVal = obj[key];


    To delete a key value pair:

    delete obj[key];


    Hope this helps.

    ReplyDelete
  3. If your data structure is guaranteed to have a value for each integer (i.e. won't jump from say 3.9 straight to 5.9 in the even columns) you can save a bit of effort and use

    var arr = "-0.0020057306590257895, 50, 0.09598853868194843, 50, 0.19398280802292264, 49.99999999999999, 0.2919770773638969, 50".split(",");
    var result = [];

    for (index = 0; index < arr.length - 1; index += 2) {
    result.push(parseFloat(arr[index + 1]));
    }


    NB - this also has numbers rather than a strings as its values due to using parseFloat

    ReplyDelete