Map-Reduce in Node

我有我的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); } 

它做的工作,但我不知道这是否有意义的performance或毫无意义? 在这里他们build议使用map reduce,但是我还是很困惑,怎样才能用map和reduce来提高性能; 任何帮助表示赞赏。

谢谢

在你的情况下, reduce函数中没有asynchronous,所以你最好使用常规的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 } 

如果它可能是一个潜在的大型数组,并且标准的JavaScript Array.prototype.reduce循环将花费太长时间,使得服务器挂起(在进行循环时不能回答请求),那么也可以进行asynchronous调用。

asynchronous操作将花费比Array.prototype.reduce,forEach或map更长的时间,但是由于服务器在完成之前(在步骤之间)可以回答请求,所以付出的代价是很大的。

你也可以使用asynchronous的callback来获取每一步的部分计算。

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

方法1 – 同步降低(最接近给出的代码)

虽然async库的reduce函数是有用的,但只有在reduce操作执行asynchronous操作(具有callback的操作)时才有必要。 对于简单和同步的任务,本地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

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

 // 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与数组: }, {}); 会变成}, []);

祝你好运!