如何重用for循环,每次对数组进行不同的索引

时间:2017-07-17 15:11:09

标签: javascript loops reusability higher-order-functions

所以,我在switch语句中有一段代码,几乎完全在每个case部分重复。第一种情况的代码如下所示:

// Some working arrays being defined in each case
countArr = createArrWithZeroes(height);
processArr = createEmpty2DArr(width, height);

for (j = 0; j < height; j++) {
    for (k = 0; k < width; k++) {
        item = arr[j][k];
        if (item !== null) {
            // Accessing the working arrays, note the indexing
            processArr[j][countArr[j]] = item;
            countArr[j]++;
        }
    }
}

在下一个案例中,我有:

countArr = createArrWithZeroes(width);
processArr = createEmpty2DArr(width, height);

for (j = 0; j < height; j++) {
    for (k = 0; k < width; k++) {
        item = arr[j][k];
        if (item !== null) {
            processArr[countArr[k]][k] = item;
            countArr[k]++;
        }
    }
}

依此类推,每个案例都在两个for循环中使用不同的索引。请注意,countArr在两者之间也有不同的定义。

我觉得这段代码可以被抽象出来,以便可以重复使用,但我不知道该怎么做。我可以在for块中移动switch语句,但问题是countArr数组也需要针对每种情况进行不同的定义。那么我最终会得到两个switch语句,其中一个是for循环中的两个(看起来不太好)。有没有办法用高阶函数解决这个问题?

1 个答案:

答案 0 :(得分:0)

您可以将循环代码封装在函数中。写它以便它可以接受回调函数;这个回调将允许你传入不同的代码段,例如。

// First callback- This has the code found in your first nested for statement
var itemFunctionOne = function(processArr,index,countArr,item) {
 processArr[index][countArr[index]] = item;
};

// Second callback- This has the code found in your second nested for statement
var itemFunctionTwo = function(processArr,index,countArr,item) {
 processArr[countArr[index]][index] = item;
};

// Encapsulate your looping code in a function. Write it so that it can accept a callback function.
var itemProcessor = function(itemFunction) {
 countArr = createArrWithZeroes(height);
 processArr = createEmpty2DArr(width, height);

 for (j = 0; j < height; j++) {
  for (k = 0; k < width; k++) {
      item = arr[j][k];
      if (item !== null) {
          // Accessing the working arrays, note the indexing
          itemFunction();
          countArr[j]++;
      }
  }
 }
}

// You could  then call this in your switch statement
itemProcessor(itemFunctionOne)

// ...and this
itemProcessor(itemFunctionTwo)

因为JavaScript中的对象(以及数组)是通过引用传递的,所以回调函数将按预期工作。

请注意,我还没有测试过上面的代码!

我在行动here

中写了一个非常简单的模式示例