2

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?

7
  • where is your research effort? Commented Feb 13, 2012 at 16:09
  • I have tried using the javascript 'split' function without any success. And so far every method I have seen uses this function. I'm certain I am missing something simple but string.split(',') results in a javscript error of .split is not a function everytime I try to use it. I'm sure this is simply down to me not having a good enough graps of plain javascript, therefore hoped that someone could point me in the right direction. Commented Feb 13, 2012 at 16:12
  • Some javascript terminology: {} is an "object" or "hash", these have key/value pairs. [] is an "array", it is just an ordered list, these do not have keys. Commented Feb 13, 2012 at 16:13
  • I guess the question should be how can I convert this into an object with the indexing that I require then. My apologies for the poor terminology, this is due to my inexperience. Commented Feb 13, 2012 at 16:15
  • @gordyr No worries, since Javascript is loosely typed it's difficult to pick up what differences are meaningful. Commented Feb 13, 2012 at 16:18

3 Answers 3

4

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:

  1. {} 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.
  2. [] 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']).
Sign up to request clarification or add additional context in comments.

1 Comment

Perfect... This is exactly what I needed, and actually far more simple than I imagined. Thank you nwellcome for a clean and well articulated answer, as well as some good personal learnings. :-)
1
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.

1 Comment

Another good answer thank you Indikaf.... Unfortunately nwellcome beat you to it by a couple of minutes, and his solution did exactly what I needed (as does your incidentally.) Thank you for taking the time to answer though. :-)
1

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.