节点中的 Map-Reduce
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);
}
它完成了工作,但我不确定这在性能方面是否有意义,还是毫无意义? Here 他们建议使用 map reduce,但我仍然很困惑如何使用 map 和 reduce 来提高性能;感谢您的帮助。
谢谢
方法 1 - 同步归约(最接近给定的代码)
虽然 async
库的 reduce
函数很有用,但仅当 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:
}, {});
会变成 }, []);
祝你好运!
在你的情况下,你的 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 }
如果它可能是一个潜在的大数组并且标准 JavaScript Array.prototype.reduce 循环会花费太长时间,使服务器挂起(无法回答在执行该循环时请求)。
异步操作将比 Array.prototype.reduce、forEach 或 map 花费更长的时间,但这是值得的,因为服务器可以在完成之前(在步骤之间)响应请求。
您也可以使用异步的回调来获取每个步骤的部分计算。
如果数组永远不会那么大并且您不需要部分结果,您应该坚持使用标准数组的同步方法。
我有我的 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 和 reduce 来提高性能;感谢您的帮助。
谢谢
方法 1 - 同步归约(最接近给定的代码)
虽然 async
库的 reduce
函数很有用,但仅当 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:
}, {});
会变成 }, []);
祝你好运!
在你的情况下,你的 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 }
如果它可能是一个潜在的大数组并且标准 JavaScript Array.prototype.reduce 循环会花费太长时间,使服务器挂起(无法回答在执行该循环时请求)。
异步操作将比 Array.prototype.reduce、forEach 或 map 花费更长的时间,但这是值得的,因为服务器可以在完成之前(在步骤之间)响应请求。
您也可以使用异步的回调来获取每个步骤的部分计算。
如果数组永远不会那么大并且您不需要部分结果,您应该坚持使用标准数组的同步方法。