我有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并减少以提高性能;任何帮助表示赞赏。
由于
答案 0 :(得分:0)
虽然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 }
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 }
如果对象的所有键(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的回调来获取每个步骤的部分计算。
如果数组永远不会那么大并且您不需要部分结果,那么您应该坚持使用标准数组的同步方法。