节点中的Map-Reduce

时间:2015-04-06 21:22:21

标签: javascript node.js asynchronous mapreduce async.js

我有array=[{id:"1"}, {id:"2"}, {id:"3"}]并希望将其转换为对象:{"1":true, "2", true, "3":true};  所以我做了以下事情:

async.reduce(myArray, {}, function (memo, item, callback) {
    memo[item.id] = true;
    callback(null, memo);
}, function (err, myObj) {
    console.log("converted object", myObj);
}

它完成了这项工作,但是我不确定这在性能方面是否有意义还是毫无意义? Here他们建议使用map reduce,但我仍然很困惑如何使用map并减少以提高性能;任何帮助表示赞赏。

由于

3 个答案:

答案 0 :(得分:0)

方法1 - 同步减少(最接近给定代码)

虽然reduce库的async函数很有用,但只有当reduce操作执行异步操作(具有回调的操作)时才需要它。对于简单和同步任务,本机Javascript Array.reduce方法就足够了。

// given myArray like [{id:"1"}, {id:"2"}, {id:"3"}]

var newObject = myArray.reduce(function(obj, current){
    obj[current.id] = true;
    return obj;
}, {}); // { '1': true, '2': true,'3': true }

方法2 - Array.forEach

通过创建一个空对象,然后循环遍历数组并添加它,此方法将产生相同的结果。

// given myArray like [{id:"1"}, {id:"2"}, {id:"3"}]

var newObject = {};

myArray.forEach(function(element){
    newObject[element.id] = true;
});

// newDictionary is now { '1': true, '2': true,'3': true }

方法2½ - 数组而不是对象

如果对象的所有键(id s)都是整数,则可以考虑使用数组而不是对象。

方法1与数组: [{}].concat(myArray)将成为[[]].concat(myArray)

方法2与数组: }, {});会更改为}, []);

祝你好运!

答案 1 :(得分:0)

在您的情况下,reduce函数中没有异步,因此您最好使用常规Array.prototype.reduce

var array = [{id:"1"}, {id:"2"}, {id:"3"}];
var newArray = array.reduce(function(cur, val) {
    cur[val.id] = true;
    return cur;
}, {});

console.log(newArray);
// => { '1': true, '2': true, '3': true }

答案 2 :(得分:0)

如果asyncs调用可能是一个潜在的大型数组并且标准的JavaScript Array.prototype.reduce循环需要太长时间,使服务器挂起(在执行该循环时无法回答请求),那么进行asyncs调用可能也很有用。

异步操作将花费比Array.prototype.reduce,forEach或map更长的时间,但由于服务器可以在完成之前(步骤之间)回答请求,因此需要付费。

此外,您可以使用async的回调来获取每个步骤的部分计算。

如果数组永远不会那么大并且您不需要部分结果,那么您应该坚持使用标准数组的同步方法。