所以,我在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循环中的两个(看起来不太好)。有没有办法用高阶函数解决这个问题?
答案 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
中写了一个非常简单的模式示例