Может ли кто-нибудь помочь мне с этим алгоритмом разделения массивов из некоторых значений? - PullRequest
3 голосов
/ 12 июля 2020

Я пытаюсь автоматизировать свою работу и разбиваю большой массив на более мелкие, например:

function splitArray(arr, firstbreak, secondBreak, thirdBreak, fourthBreak) {
  var split1 = arr.slice(0, firstbreak);
  var split2 = arr.slice(firstbreak, firstbreak + secondBreak);
  var split3 = arr.slice(firstbreak + secondBreak, firstbreak + secondBreak + thirdBreak);
  var split4 = arr.slice(firstbreak + secondBreak + thirdBreak, firstbreak + secondBreak + thirdBreak + fourthBreak);

  console.log(split1); //[1,2,3]
  console.log(split2); //[4,5,6,7]
  console.log(split3); //[8]
  console.log(split4); //[9,10]
}


splitArray([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 2, 4, 3, 1, 2)

Как я могу это автоматизировать? Я пробовал использовать для l oop, но немного застрял, я не могу получить повторяющуюся формулу ...

Ответы [ 4 ]

7 голосов
/ 12 июля 2020

Вы можете собрать длины и сопоставить массивы деталей.

function splitArray(array, ...lengths) {
    return lengths.map((i => l => array.slice(i, i += l))(0));
}

console.log(splitArray([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 2, 4, 3, 1, 2))
.as-console-wrapper { max-height: 100% !important; top: 0; }
4 голосов
/ 12 июля 2020
• 1000 1003 * номера переменных точек останова.

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

Читая, как вы используете точки останова, они больше "длины" чем «точки останова», поэтому я назвал их «длинами» в этом коде.

Я дал два разных вызова splitArray, потому что вызов, который вы делаете в вашем примере, не будет (с вашим кодом) производить вывод указан в комментариях к коду.

function splitArray(arr, lengths) {
  let pointer = 0;
  lengths.forEach(length => {
    console.log(arr.slice(pointer, pointer + length));
    pointer += length;
  })
}

splitArray([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [2, 4, 3, 1, 2])

// And to produce the example output in your question:
splitArray([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [3, 4, 1, 2])

Если должен передавать точки останова / длины как отдельные входные параметры, а не как массив, вы можете использовать оператор Javascript ... для автоматического соберите их в массив, например:

function splitArray(arr, ...lengths)

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

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

1 голос
/ 12 июля 2020

Похоже, вы ищете функцию распределения массивов ...


    function distributeArray(source, ...dists){
       var results = [];
       var next = 0;
       for( var i = 0; i < dists.length; i++){
         results[i] = results[i] ? results[i] : [];
         for( var j = 0; j < dists[i]; j++){
            next < dists.length ? results[i][j] = source[next++] : null;
         }
       }
       return results;
    }

используя map и используя поведение возврата среза, вы могли бы:


    function distributeArray(source, ...dists) {
        let pos = 0;
        return dists.map(function(span){ 
          return source.slice(pos, pos += span);
        });
    }

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


   function distributeArray(source, ...dists) {
        return((results, n, j, i) => {
           for(i = 0; i < dists.length; i++){
             results[i] = results[i] ? results[i] : [];
             for(j = 0; j < dists[i]; j++) n < dists.length ? results[i][j] = source[n++] : null;
           }
           return results;
        })([], 0);
    }

, которое упрощается с помощью стрелочных функций, карты и фрагмента становится:


    function distributeArray(source, ...dists) {
        return dists.map((p => s => source.slice(p, p += s))(0));
    }

function distributeArray(source, ...dists) {
  results = [];
  next = 0;
  end = source.length;

  dists.forEach(function(size) {
    if (next > end) {
      results.push([]);
    } else {
      results.push(source.slice(next, next += size));
    }
  });

  return results;
}

console.log(distributeArray([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 2, 4, 3, 1, 2));
1 голос
/ 12 июля 2020

Моя попытка разбить массив на основе динамики c ломается

let splitar = (ar,breaks) => {
   breaks.forEach(x=>{
       console.log(ar.splice(0,x));
   });
   console.log('remaining',ar);
}

let breaks = [4,3,5,1]
let ar = [11,23,43,1,2,4,12,6,8,34,23,51,12,5,123]

splitar(ar,breaks);

Результат

[ 11, 23, 43, 1 ]
[ 2, 4, 12 ]
[ 6, 8, 34, 23, 51 ]
[ 12 ]
remaining [ 5, 123 ]
...