3

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.

asked Aug 31, 2018 at 7:37
7
  • 2
    "I tried with split method but without success." Please show your code. Commented Aug 31, 2018 at 7:38
  • This might be helpful gist.github.com/webinista/11240585 Commented Aug 31, 2018 at 7:39
  • @kgbph You should never extend the prototypes of built-ins. E.g. never extend Array.prototype. Commented Aug 31, 2018 at 7:40
  • @str Why not? It's perfectly fine to extend prototypes if well documented. And of course you need to take care of conflicts. But if someone extends prototypes he/she should know what they do anyway. Commented Aug 31, 2018 at 7:43
  • @Akaino Why is extending native objects a bad practice? Commented Aug 31, 2018 at 7:48

7 Answers 7

6

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; }

answered Aug 31, 2018 at 7:42
Sign up to request clarification or add additional context in comments.

Comments

5

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);

answered Aug 31, 2018 at 7:40

Comments

1

How about:

"'10:00','13:00','12:00','15:00','08:00','12:00'"
.replace(/'/g, '').replace(/(,[^,]*),/g,"1ドル;")
.split(';').map(itm => itm.split(','))
answered Aug 31, 2018 at 7:48

Comments

1

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.

answered Aug 31, 2018 at 7:49

Comments

1

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);
answered Aug 31, 2018 at 7:54

Comments

1

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; }

answered Aug 31, 2018 at 7:44

Comments

0

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);

answered Sep 3, 2018 at 12:14

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

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.