64
[ {name:'hi',data:'1,2,3,4,5'} , {name:'hello',data:'5,4,3,2,1'} ]

What I need is to apply a split on data of each object in array so that the result would be:

[ {name:'hi',data:[1,2,3,4,5]} , {name:'hello',data:[5,4,3,2,1]} ]

I know I can loop through the array using for each and produce a new array, but is there a better, faster method?

var arr = [{
    name: 'hi',
    data: '1,2,3,4,5'
}, {
    name: 'hello',
    data: '5,4,3,2,1'
}];

var new_arr = [];
for (i in arr) {
    var temp = {};
    temp.name = arr[i].name;
    temp.data = arr[i].data.split(',');
    new_arr.push(temp);
}
4
  • Do you need to make a new array? Can you just adjust the original? Commented Apr 21, 2015 at 15:45
  • 6
    Array.prototype.map Commented Apr 21, 2015 at 15:46
  • 3
    Don't use for...in loops to iterate arrays! Commented Apr 21, 2015 at 15:47
  • @epascarello no i dont need new array all what i need is to adjust original Commented Apr 21, 2015 at 17:57

2 Answers 2

93

You could use Array.prototype.map:

var new_array = old_array.map(function(e) { 
  e.data = e.data.split(','); 
  return e;
});

As the comment said, this way changes the old_array. You could also return a new object in the callback function without changing the original array.

Sign up to request clarification or add additional context in comments.

3 Comments

Note this modifies the objects in old_array.
@xdazz is right you can see for yourself here
Apparently excluding the return e; still gives the same result. Also, if you're intentionally changing the old_array, then var new array = is also unneeded. Therefore, a shorter version is: old_array.map(function(e){ e.data = e.data.split(',') });
26
var data = [{
    name: 'hi',
    data: '1,2,3,4,5'
}, {
    name: 'hello',
    data: '5,4,3,2,1'
}];

You can use the Array.prototype.map on data to construct a new Array, like this

var result = data.map(function (currentObject) {
    return {
        name: currentObject.name,
        data: currentObject.data.split(",").map(Number)
    };
});

Here, we split the currentObject.data based on , and then we call Number function on all the split strings, so that you will get the result object's data as numbers, as you wanted in the question.

Output

[{
    name: 'hi',
    data: [1, 2, 3, 4, 5]
}, {
    name: 'hello',
    data: [5, 4, 3, 2, 1]
}]

let data = [{
    name: 'hi',
    data: '1,2,3,4,5'
  }, {
    name: 'hello',
    data: '5,4,3,2,1'
  }],
  result = data.map(function(currentObject) {
    return {
      name: currentObject.name,
      data: currentObject.data.split(",").map(Number)
    };
  });
console.log(result);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.