考虑以下数组:
['123', '456', '789', '000', '111', '222', '333', '444', '555']
现在,假设我想将每3个项目映射到一个函数。
也就是说,123
,456
,789
会映射到function () { ... }
。
下一个000
,111
和222
将映射到另一个function () { ... }
我想这样做,因为我需要对数据库执行批量请求,但我可以请求的最大ID数量是每批25个。
所以我的目标是将每25个项目映射到一个函数(将执行批处理请求),然后使用async.parallel
并行执行每个函数。
问题在于我无法使用map
或async.map
,因为这会在我的阵列上映射每个项。我打算做的是将每25个连续项目映射到单个对象/函数。
这可能吗?
我正在寻找任何JavaScript或NodeJS解决方案。
答案 0 :(得分:0)
与Node.js不完全相关,但这是一个可能的解决方案:
var funcs = [a, b, c, ...], // the list of functions
arr = [], // your data
items = 25,
mapOfFuncs = [];
for(var i = 0, len = arr.length, f; i < len; i++){
f = funcs[Math.floor(i / items)];
mapOfFuncs.push(f);
}
根据观察结果,每24个连续数字除以25并且被平铺后将产生相当于相应函数索引的某个数字。
它将产生一个数组mapOfFuncs
,它具有与arr
元素相对应的函数。例如,对于arr = ['123', '456', '789', '000', '111', '222', '333', '444', '555']
和items = 3
,输出将为:[a, a, a, b, b, b, c, c, c]
答案 1 :(得分:0)
更像这样?
function groupBy(size, arr){
for(var i=0, out=[]; i<data.length; i+=size)
out.push( data.slice(i, i+size) )
return out;
}
var data = ['123', '456', '789', '000', '111', '222', '333', '444', '555'];
async.parallel(groupBy(3, data).map( part => processData.bind(null, part) ), callback);
//or
async.parallel(groupBy(3, data).map( part => ()=>processData(part) ), callback);
//or
async.map(groupBy(3, data), processData, callback);
答案 2 :(得分:-1)
这里可以使用javascript函数splice
,将每个3(或25)个元素从原始数组中分离出来。
侧注:请注意,splice会修改原始数组。
// this removes the first n elements out of the array and returns them
var batch= data.splice(0, length)
这是一个完整的解决方案:
var data = ['123', '456', '789', '000', '111', '222', '333', '444', '555']
, length = 3
// this function is called recursively until the whole initial array is processed (and emptied)
function splitTable() {
var batch= data.splice(0, length)
// process your batch here (map to the function you want)
console.log('batch' + batch)
if (data.length)
splitTable()
}
// initial call of the function
splitTable()