如何使用 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 来删除“姓氏”道具,而不是选择所有想要的。
希望这里有人有足够的经验来指导我解决我发现的这个特殊问题。 所以我正在使用这个特殊的 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 来删除“姓氏”道具,而不是选择所有想要的。