将数组的多个项映射到单个对象/函数

时间:2016-01-20 14:57:14

标签: javascript arrays node.js

考虑以下数组:

['123', '456', '789', '000', '111', '222', '333', '444', '555']

现在,假设我想将每3个项目映射到一个函数。

也就是说,123456789会映射到function () { ... }

下一个000111222将映射到另一个function () { ... }

我想这样做,因为我需要对数据库执行批量请求,但我可以请求的最大ID数量是每批25个。

所以我的目标是将每25个项目映射到一个函数(将执行批处理请求),然后使用async.parallel并行执行每个函数。

问题在于我无法使用mapasync.map,因为这会在我的阵列上映射每个项。我打算做的是将每25个连续项目映射到单个对象/函数。

这可能吗?

我正在寻找任何JavaScript或NodeJS解决方案。

3 个答案:

答案 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()

demo