合并来自Promise.all的许多数组

时间:2016-08-19 23:06:04

标签: javascript arrays

Promise.all完成时,它返回包含数据的数组数组。在我的例子中,数组只是数字:

[
    [ 1, 4, 9, 9 ],
    [ 4, 4, 9, 1 ],
    [ 6, 6, 9, 1 ]
]

数组可以是任何大小。

目前我正在这样做:

let nums = []
data.map(function(_nums) {
    _nums.map(function(num) {
        nums.push(num)
    })
})

有没有其他方法可以做到这一点? lodash是否有任何能够执行此操作的功能?

4 个答案:

答案 0 :(得分:6)

使用reduceconcat

data.reduce(function (arr, row) {
  return arr.concat(row);
}, []);

或者,concatapply

Array.prototype.concat.apply([], data);

答案 1 :(得分:4)

我会这样做;



var a = [
    [ 1, 4, 9, 9 ],
    [ 4, 4, 9, 1 ],
    [ 6, 6, 9, 1 ]
],
    b = [].concat(...a)

console.log(b)




答案 2 :(得分:2)

您实际上不需要任何类型的库,您可以concat使用apply

Promise.all(arrayOfPromises).then((arrayOfArrays) {
    return [].concat.apply([], arrayOfArrays);
});

但是,如果您使用的是lodash,则可以使用_.flatten(arrayOfArrays)获得相同的效果。

答案 3 :(得分:0)

如果使用async / await,以扩展@Retsam的答案,您可以这样做

const mergedArray = []
  .concat
  .apply([], await Promise.all([promise1, promise2, promiseN]));

我使用AWS开发工具包所做的一个真实示例,它从多个IAM用户组中获取用户名列表

const users = await getActiveUsersByGroup(['group1', 'group2'])

async function getActiveUsersByGroup(groups = []) {
  getUsersByGroupPromises = groups.map(group => getUsersByGroup(group));
  const users = []
    .concat
    .apply([], await Promise.all(getUsersByGroupPromises)) // Merge (concat) arrays
    .map(users => users.UserName); // Construct new array with just the usernames
  
  return users;
}

async function getUsersByGroup(group) {
  const params = {
    GroupName: group,
    MaxItems: 100     // Default
  };
  const { Users: users } = await iam.getGroup(params).promise();

  return users;
}