如何使用 lodash 扩展对象列表并将其与另一个列表合并

How to extend and merge a list of objects with another list using lodash

希望这里有人有足够的经验来指导我解决我发现的这个特殊问题。 所以我正在使用这个特殊的 API,returns 一个类似于以下内容的对象:

const api_response = {
  environment_list: ["dev", "non-prod"],
  member_list: [
    { id: "abc-456", name: "Homer", "last-name": "Simpson", role: "admin" },
  ],
};

我要实现的目标是根据上面的环境列表创建一个包含用户 ID、名称、角色和环境的新列表,因此它应该如下所示:

[
   { id: 'abc-456', name: 'Homer', role: 'admin', environment: 'dev' },
   { id: 'abc-456', name: 'Homer', role: 'admin', environment: 'non-prod' }
]

现在我所做的是:

我创建了一个变量来隔离将要合并的每个值:

const userList = _.map(api_response.member_list, (data) => ({
  id: data.id,
  name: data.name,
  role: data.role,
}));

const environmentList = _.map(api_response.environment_list, (data) => ({
  environment: data,
}));

然后将这两个合并为一个对象列表:

const extendAndMergeList = _.map(environmentList, (data) =>
  _.map(userList, (items) => ({ ...items, environment: data.environment }))
);

并且输出与我的最终产品足够接近:

[
  [
    { id: 'abc-456', name: 'Homer', role: 'admin', environment: 'dev' }
  ],
  [
    {
      id: 'abc-456',
      name: 'Homer',
      role: 'admin',
      environment: 'non-prod'
    }
  ]
]

我可能在做一些愚蠢的事情,但很想得到一些指导如何将此从列表列表 trim 转换为对象列表。

再看看我采取的所有步骤:

const _ = require("lodash");

const api_response = {
  environment_list: ["dev", "non-prod"],
  member_list: [
    { id: "abc-456", name: "Homer", "last-name": "Simpson", role: "admin" },
  ],
};

const userList = _.map(api_response.member_list, (data) => ({
  id: data.id,
  name: data.name,
  role: data.role,
}));

const environmentList = _.map(api_response.environment_list, (data) => ({
  environment: data,
}));

const extendAndMergeList = _.map(environmentList, (data) =>
  _.map(userList, (items) => ({ ...items, environment: data.environment }))
);

再次感谢您的帮助!

最简单的方法是使用 _.flatten method of lodash 来实现:

const _ = require('lodash');

const data = _.map(api_response.environment_list, e => 
    _.map(api_response.member_list, m => ({
        id: m.id, 
        name: m.name, 
        role: m.role, 
        environment: e
    })
); // This step achieves the exact same thing that you have achieved up until now in your question.

const flattenedData = _.flatten(data); // This is the method you need to make the array "flat".

console.log(flattenedData);

你也可以尝试在不使用 lodash 的情况下这样做,效率更高一点,方法是:

const output = [];
for (const e of api_response.environment_list) {
    for (const m of api_response.member_list) {
        const obj = {
            id: m.id, 
            name: m.name, 
            role: m.role, 
            environment: e
        };
        output.push(obj);
    }
}

我相信你可以使用像这样的简单地图:

const userList = _.map(api_response.environment_list, (env) => ({
  ...(_.pick(api_response.member_list, ['id', 'name', 'role' ])),
  environment: env
}))

对于每个环境,您 return 一个具有所需键的对象并添加环境属性

您也可以使用 _.omit 而不是 _.pick 来删除“姓氏”道具,而不是选择所有想要的。