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与数组: }, {});
会变成}, []);
祝你好运!
- 如何使用expressjs和mongodb使用promises /callback?
- 是否有可能build立一个dynamic的任务列表nodejsasynchronous(瀑布,系列等…)
- 如何在node.js中asynchronous执行多个REST API请求?
- Async.retry在等待间隔之前立即执行
- Nodejs / Async:如何在代码片段中提到的async.map的iteratee函数中如何工作?
- 用PhantomJS桥接序列化function
- NodeJSasynchronous – 即使有一些失败,仍继续执行多个http请求
- 为什么瀑布和series / parallelLimit(1)之间的async.js不一致?
- async.each在完成所有迭代后callback