试图找到一种方法来重构我的函数以使其更有效

问题描述 投票:0回答:1

我具有如下所示的功能,该功能根据长度参数将数字数组分组。长度表示每个子阵列的最大长度。我试图找出的是一种可以将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想要实现的只需要调用Id要创建的数组和子数组的大小。只是对所发生的事情有一个简短的了解,这些数组的基础就是看它们是否可以将完整的数组制作成“长度”的大小,并且任何溢出都会推送到另一个子数组。一个例子如下:

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

这将返回[[1,3,5][2,4,6][7,9][8,10]]

因此,如果有人可以帮助我从console.log语句中删除fnc参数并将其放入函数中,将非常有帮助

javascript arrays function callback refactoring
1个回答
1
投票

您遇到的问题是,您知道此参数将始终相同,因此存在无需每次都写;可以将其烘焙到函数中。

最简单的说,您可以从参数列表中直接取出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实际上几乎没有指向函数。每次都是相同的操作。只需执行该操作并将其粘贴到函数调用的位置即可。另外,您应始终使用letconst声明事物,而不仅仅是给它们分配没有声明关键字的关键字-这会使它们成为全局变量,并且它们可能以意外的方式与您的全局命名空间交互。最后,我敦促您将函数重命名为描述其功能的名称。这有助于每个阅读您的代码的人都更直观地理解它,包括您将来的自我。

这就是所有人的样子:

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]]
© www.soinside.com 2019 - 2024. All rights reserved.