Разбить массив на меньшие массивы, разделенные пробелами - PullRequest
0 голосов
/ 30 августа 2018

У меня есть строка ' 1 22 333 4444 5 6 ', и я не хочу создать массив, подобный этому - [[1, 22], [22, 333], [4444, 5], [5, 6]];

Я пытался использовать для ... цикла, но это не помогло.

let str = ' 1 22 333 4444 5 6 ';
let arr = [];

for(let i = 0; i < str.length; i++)
  arr.push(str.slice(str.indexOf(' ', i),str.indexOf(' ',i+1)));

И он дал такой вывод:

[ ' 1', '', ' 22', '', ' 333', '', ' 4444', '', ' 5', '', ' 6', '', '' ]

Вместо: [[1, 22], [22, 333], [4444, 5], [5, 6]];

Почему это неправильно? Кто-нибудь знает, как это сделать?

Ответы [ 8 ]

0 голосов
/ 30 августа 2018

В качестве альтернативы вы можете использовать регулярное выражение с группой захвата и положительным прогнозом, чтобы утверждать, что ниже приведены одна или несколько цифр, и фиксировать их во второй группе захвата.

(\d+) (?=(\d+))

Затем добавьте группу 1 и группу 2 в массиве к arr.

const regex = /(\d+) (?=(\d+))/g;
let m;
let str = ' 1 22 333 4444 5 6 ';
let arr = [];

while ((m = regex.exec(str)) !== null) {
  arr.push([m[1], m[2]]);
}

console.log(arr);
0 голосов
/ 30 августа 2018

const res = ' 1 22 333 4444 5 6 '
        .split(' ')
        .filter(Boolean)
        .map(v => [v])
        .reduce((acc, curr, idx) => {
            acc = idx % 2 ? [...acc.slice(0, acc.length-1), acc[acc.length-1].concat(curr)] : [...acc, curr];
            return acc;
        }, []);
        
console.log(res);
0 голосов
/ 30 августа 2018

Если я правильно интерпретирую задачу, это можно решить одним из способов:

' 1 22 333 4444 5 6 '
  .trim()
  .split(' ')
  .reduce((arr, item, index) => {
    if (index % 2 === 0) {
      arr.push([ item ]);
    } else {
      arr.slice(-1)[0].push(item);
    }
    return arr;
  }, [])
0 голосов
/ 30 августа 2018

Судя по вопросу, формат вывода не ясен. Вы можете сделать это несколькими способами в зависимости от желаемого формата вывода:

1) если вы хотите, чтобы каждый последний элемент был первым элементом следующего фрагмента

const input = ' 1 22 333 4444 5 6 ';

const result = input.trim().split(' ').map(Number).reduce((all, n, i, arr) => i ? [...all,[arr[i-1],n]] : [] ,[])

console.log(result);

2) если вы хотите разделить его на две части

const input = ' 1 22 333 4444 5 6 ';

const result2 = input.match(/(\d+ \d+)/gi).map(a => a.split(' ').map(Number));

console.log(result2);
0 голосов
/ 30 августа 2018

let str = ' 1 22 333 4444 5 6 ';
let arr = [];
let temp = str.trim().split(" ");
for (let i = 0; i < temp.length - 1; i++)
  arr.push([parseInt(temp[i]), parseInt(temp[i + 1])]);

console.log(arr);
for (let i = 0; i < arr.length - 1; i++) {
  console.log(arr[i]);
}

вывод вышеуказанного кода

[[1, 22], [22, 333], [4444, 5], [5, 6]]
[1, 22] 
[22, 333]
[4444, 5]
[5, 6]
0 голосов
/ 30 августа 2018

Вы должны запустить этот код

let str = ' 1 22 333 4444 5 6 ';
let arr = [];
var res = str.split(" ");
console.log(res);
var a = res.filter(i => i !== "");
console.log(a);
var tempArr = [];
var counter = 0;
for (var i = 0; i < a.length; i++){
    counter++;
    tempArr.push(a[i]);
    if(counter == 2){
        arr.push(tempArr);
        tempArr = [];
        counter = 0;
    }
}
console.log(arr);
0 голосов
/ 30 августа 2018

Может быть так:

let str = ' 1 22 333 4444 5 6 ';
let arr = [];

let str_arr=str.split(' ');
for(let key in str_arr){
   if(str_arr[key]!=''){
   	  let add_arr=[];
   	  add_arr.push(parseInt(str_arr[key],10));
   	  let next_key=parseInt(key,10)+1;
   	  if(str_arr[next_key]){
   	  	add_arr.push(parseInt(str_arr[next_key],10));
   	    arr.push(add_arr);
   	  }
   }
}
console.log(arr);
0 голосов
/ 30 августа 2018

Невозможно сделать то, что вы хотели бы сделать, потому что разделитель между каждым из чисел согласован для всей строки. Вам нужно иметь один разделитель для каждого из чисел, а затем другой разделитель для групп.

Например;

let str = '1 22,333 4444,5 6';
let groups = str.split(",");
let arr = [];

for (let i = 0; i < groups.length; i++)
  arr.push(groups[i].split(" "));
  
console.log(arr);
...