Как разделить массив с помощью разделителя и ограничения в javascript?

#javascript #arrays

#javascript #массивы

Вопрос:

Я намерен разделить массив с помощью разделителя и выбрать предел его разделения.

 var arr = [89, 'sdf', 0, null, 0, true, 89, 0, 'sdf'];
var res = [];
while (arr.length) {
  res.push(arr.splice(0, 2));
}
console.log(res) 

Например: If 0 — разделитель и 2 является пределом

 arr.split(0, 2)
[[89, 'sdf'], [null]] //output
 

Комментарии:

1. почему ноль исчез?

2. Почему вы сохраняете null , но удаляете 0 ?

3. @NinaScholz это потому, что он хочет разделить массив, используя 0 в качестве разделителя

4. Как это работает?? Разве это не должно быть [[89, "sdf"], [0, true]] ?

5. Идея состоит в том, чтобы использовать 0 в качестве разделителя и выводить значение [[89, ‘sdf’], [null]], если пользователь решит разделить массив следующим образом arrat.split(0, 2) или array.separate(0, 2) .

Ответ №1:

Вы могли бы использовать indexOf и splice подобное:

 var arr = [89, 'sdf', 0, null, 0, true, 89, 0, 'sdf'];

function splitArray(arr, seperator, count) {
  let result = [], 
        copy = arr.slice(), // if you don't want to mutate the original array
        counter = 0;
  
  while(counter < count amp;amp; copy.length > 0) {
    const index = copy.indexOf(seperator);
    if(index !== - 1) {
      result.push(copy.splice(0, index));
      copy.shift(); // remove the seperator
    }
    else result.push(copy.splice(0)) // add the remaining items

    counter  
  }
  
  return result
}

console.log(splitArray(arr, 0, 2))
console.log(splitArray(arr, 0, 3)) 

Ответ №2:

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

 function split(array, length, separator) {
    var result = [],
        count = 0,
        i = 0;

    while (count < length amp;amp; i < array.length) {
        if (array[i] === separator) {
            count  ;
            i  ;
            continue;
        }
        result[count] = result[count] || [];
        result[count].push(array[i  ]);
    }
    return resu<
}

console.log(split([89, 'sdf', 0, null, 0, true, 89, 0, 'sdf'], 2, 0)); 

Версия с indexOf и slice .

 function split(array, length, separator) {
    var result = [],
        p,
        i = 0;

    while ((p = array.indexOf(separator, i)) !== -1 amp;amp; result.length < length) {
        result.push(array.slice(i, p));
        i = p   1;
    }
    if (result.length < length) result.push(array.slice(i));
    return resu<
}

console.log(split([89, 'sdf', 0, null, 0, true, 89, 0, 'sdf'], 2, 0));
console.log(split([89, 'sdf', 0, null, 0, true, 89, 0, 'sdf'], 5, 0)); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

Комментарии:

1. Ах, умно и просто, я написал решение, используя сериализацию, разделение, обрезку, десериализацию, но старые добрые циклы будут легче выполнять эту работу

Ответ №3:

вы можете использовать этот

 var arrays = [], size = 2;

var arr = [89, 'sdf', 0, null, 0, true, 89, 0, 'sdf'];
while (arr.length > 0)
    arrays.push(arr.splice(0, size));