Пытаюсь найти способ рефакторинга моей функции, чтобы сделать ее более эффективной - PullRequest
0 голосов
/ 17 июня 2020

У меня есть эта функция, как показано ниже, которая группирует массив чисел на основе параметра длины. Длина представляет собой максимальную длину каждого подмассива. То, что я пытаюсь понять, - это метод, который я могу использовать, чтобы переместить x => x % 2 из объявления переменных результата в функцию. Единственное, что я мог придумать, это обратный вызов, но я не уверен, как я мог это сделать. Любая помощь с этим приветствуется, и если вы заметите какой-либо другой избыточный код, дайте мне знать.

function myFunc(arr, length, fnc) {
  groups = []; 
  result  = [];
  for (let val of arr) {
    x = fnc(val);
    if (!groups[x]) {
      groups[x] = [];
    }
    if (!groups[x].length) {
      result .push(groups[x]);
    }
    groups[x].push(val);
    if (groups[x].length === length) {
      groups[x] = [];
    }
  }
  return result ;
}
//examples
const result1 = myFunc([1, 2, 3, 4], 2, x => x % 2)
console.log(result1) //[[1, 3], [2, 4]]

const result2 = myFunc([1, 2, 3, 4, 5, 6, 7], 4, x => x % 2)
console.log(result2) //[[1, 3, 5, 7], [2, 4, 6]]

const result3 = myFunc([1, 2, 3, 4, 5], 1, x => x % 2)
console.log(result3) //[[1], [2], [3], [4], [5]]

const result4 = myFunc([1, 2, 3, 4, 5, 6], 4, x => x % 2)
console.log(result4) //[[1, 3, 5], [2, 4, 6]]

То, что я хотел бы достичь, - это всего лишь вызвать массив и размер подмассивов, которые Id люблю творить. Просто краткое представление о том, что происходит. Массивы основаны на том, могут ли они создать полный массив до размера «length», и любое переполнение передается в другой подмассив. Пример этого выглядит так:

console.log(myfunc([1,2,3,4,5,6,7,8,9,10],3)) 

Это вернет [[1,3,5][2,4,6][7,9][8,10]]

Итак, если бы кто-нибудь мог помочь мне удалить параметр fn c из операторов console.log и поместив его в функцию, было бы очень полезно

1 Ответ

1 голос
/ 17 июня 2020

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

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

function myFunc(arr, length) {
  let fnc = x => x % 2;
  groups = []; 
  result  = [];
  for (let val of arr) {
    x = fnc(val);
    if (!groups[x]) {
      groups[x] = [];
    }
    if (!groups[x].length) {
      result .push(groups[x]);
    }
    groups[x].push(val);
    if (groups[x].length === length) {
      groups[x] = [];
    }
  }
  return result ;
}

//examples
const result1 = myFunc([1, 2, 3, 4], 2)
console.log(result1) //[[1, 3], [2, 4]]

const result2 = myFunc([1, 2, 3, 4, 5, 6, 7], 4)
console.log(result2) //[[1, 3, 5, 7], [2, 4, 6]]

const result3 = myFunc([1, 2, 3, 4, 5], 1)
console.log(result3) //[[1], [2], [3], [4], [5]]

const result4 = myFunc([1, 2, 3, 4, 5, 6], 4)
console.log(result4) //[[1, 3, 5], [2, 4, 6]]

На этом этапе на самом деле нет почти никакого смысла в том, чтобы fnc была функцией. Каждый раз это одна и та же операция. Просто возьмите эту операцию и вставьте ее вместо вызова функции. Кроме того, вы всегда должны использовать let или const для объявления вещей, а не просто назначать их без ключевого слова объявления - это делает их глобальными, и они могут неожиданно взаимодействовать с вашим глобальным пространством имен. Наконец, я настоятельно прошу вас переименовать вашу функцию так, чтобы она описывала то, что она делает. Это поможет каждому, кто читает ваш код, понять его более интуитивно, включая ваше будущее.

Вот как все это будет выглядеть:

function splitArray(arr, length) {
  let groups = []; 
  let result = [];
  for (let val of arr) {
    let x = val % 2; //this does the same thing
    if (!groups[x]) {
      groups[x] = [];
    }
    if (!groups[x].length) {
      result.push(groups[x]);
    }
    groups[x].push(val);
    if (groups[x].length === length) {
      groups[x] = [];
    }
  }
  return result;
}

//examples
const result1 = splitArray([1, 2, 3, 4], 2)
console.log(result1) //[[1, 3], [2, 4]]

const result2 = splitArray([1, 2, 3, 4, 5, 6, 7], 4)
console.log(result2) //[[1, 3, 5, 7], [2, 4, 6]]

const result3 = splitArray([1, 2, 3, 4, 5], 1)
console.log(result3) //[[1], [2], [3], [4], [5]]

const result4 = splitArray([1, 2, 3, 4, 5, 6], 4)
console.log(result4) //[[1, 3, 5], [2, 4, 6]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...