Convert javascript string to array

Viewed 16332

I have string like this

    '10:00','13:00','12:00','15:00','08:00','12:00'

I need it in format like this

Array(3)

  Array[0] ['10:00', '13:00']
  Array[1] ['12:00', '15:00']
  Array[2] ['08:00', '12:00']

I tried with split method but without success.

7 Answers

You could replace single quotes with double quotes, add brackes and parse it as JSON and get an array, which is the grouped by two elements.

var string = "'10:00','13:00','12:00','15:00','08:00','12:00'",
    array = JSON
        .parse('[' + string.replace(/'/g, '"') + ']')
        .reduce((r, s, i) => r.concat([i % 2 ? r.pop().concat(s) : [s]]), []);

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

var str = "'10:00','13:00','12:00','15:00','08:00','12:00'";
var oldArray = str.split(',');
var newArray = [];

while(oldArray.length){
    let start = 0;
    let end = 2;
    newArray.push(oldArray.slice(start, end));
    oldArray.splice(start, end);
 }
 
 console.log(newArray);

You can use String.split(',') to split into individual values, then group them based on their positions (result of integer division with 2).

I am using groupBy from 30 seconds of code (disclaimer: I am one of the maintainers of the project/website) to group the elements based on the integer division with 2. Short explanation:

Use Array.map() to map the values of an array to a function or property name. Use Array.reduce() to create an object, where the keys are produced from the mapped results.

The result is an object, but can be easily converted into an array using Object.values() as shown below:

var data = "'10:00','13:00','12:00','15:00','08:00','12:00'";

const groupBy = (arr, fn) =>
  arr.map(typeof fn === 'function' ? fn : val => val[fn]).reduce((acc, val, i) => {
    acc[val] = (acc[val] || []).concat(arr[i]);
    return acc;
  }, {});

var arr = data.split(',');
arr = groupBy(arr, (v, i) => Math.floor(i / 2));
arr = Object.values(arr);

console.log(arr);
.as-console-wrapper { max-height: 100% !important; top: 0; }

How about:

"'10:00','13:00','12:00','15:00','08:00','12:00'"
.replace(/'/g, '').replace(/(,[^,]*),/g,"$1;")
.split(';').map(itm => itm.split(','))

In this case you want to compare 2 values. To do this you can make a for loop that reads the current value and the last value and compares the two. If the last value is higher than current value, the splitting logic happens.

Either you add the current value to the last item (which is an array of strings) in the results array or you add a new array of strings at the end of the results array.

One potential solution:

let S = "'10:00','13:00','12:00','15:00','08:00','12:00'";

let R = S.split(',');

let I = 0;

let A = new Array([],[],[]);

R.map((object, index) => {
    A[I][index % 2] = R[index];
    if (index % 2 == 1) I++;
});

console.log(A);

I think use JSON.parse is better:

var array = "'10:00','13:00','12:00','15:00','08:00','12:00'";

array = JSON.parse( '[' + array.replace(/'/g,'"') + ']' );

var array2 = [];
for(var i=0;i < array.length - 1; i++){
    array2.push([array[i], array[i+1]]);
}

console.log(array2);

Related