节点中的 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½ - 数组而不是对象

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

使用数组的方法 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 花费更长的时间,但这是值得的,因为服务器可以在完成之前(在步骤之间)响应请求。

您也可以使用异步的回调来获取每个步骤的部分计算。

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