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

Javascript 如何使用lodash扩展对象列表并将其与另一个列表合并,javascript,node.js,lodash,Javascript,Node.js,Lodash,希望这里有人有足够的经验来指导我解决我发现的这个问题。 因此,我正在使用这个特殊的API,它返回一个类似于以下内容的对象: const api_response = { environment_list: ["dev", "non-prod"], member_list: [ { id: "abc-456", name: "Homer", "last-name": "Si

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

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.environment_list, (env) => ({
  ...(_.pick(api_response.member_list, ['id', 'name', 'role' ])),
  environment: env
}))
现在我所做的是:

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 }))
);
输出与我的最终产品非常接近,即:

[
  [
    { id: 'abc-456', name: 'Homer', role: 'admin', environment: 'dev' }
  ],
  [
    {
      id: 'abc-456',
      name: 'Homer',
      role: 'admin',
      environment: 'non-prod'
    }
  ]
]
我可能在做一些愚蠢的事情,但我希望能有一些指导,告诉我如何将这个列表从一个列表修剪成一个对象列表

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

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 }))
);


再次感谢您的回复

简单的方法是使用来实现这一点:

const=require('lodash');
常量数据=u.map(api_response.environment_列表,e=>
_.map(api_response.member_列表,m=>({
id:m.id,
姓名:m.name,
角色:m.role,
环境:e
})
);//这一步的效果与您到目前为止在问题中所取得的效果完全相同。
const flatteddata=u.flatted(data);//这是使数组“平坦”所需的方法。
控制台日志(扁平化数据);
您也可以尝试在不使用lodash的情况下以更高效的方式执行此操作:

const输出=[];
用于(api响应环境列表的常数){
用于(api_响应的常数m.成员列表){
常量对象={
id:m.id,
姓名:m.name,
角色:m.role,
环境:e
};
输出推力(obj);
}
}

简单的方法是使用来实现这一点:

const=require('lodash');
常量数据=u.map(api_response.environment_列表,e=>
_.map(api_response.member_列表,m=>({
id:m.id,
姓名:m.name,
角色:m.role,
环境:e
})
);//这一步的效果与您到目前为止在问题中所取得的效果完全相同。
const flatteddata=u.flatted(data);//这是使数组“平坦”所需的方法。
控制台日志(扁平化数据);
您也可以尝试在不使用lodash的情况下以更高效的方式执行此操作:

const输出=[];
用于(api响应环境列表的常数){
用于(api_响应的常数m.成员列表){
常量对象={
id:m.id,
姓名:m.name,
角色:m.role,
环境:e
};
输出推力(obj);
}
}

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

[
   { id: 'abc-456', name: 'Homer', role: 'admin', environment: 'dev' },
   { id: 'abc-456', name: 'Homer', role: 'admin', environment: 'non-prod' }
]
const userList = _.map(api_response.environment_list, (env) => ({
  ...(_.pick(api_response.member_list, ['id', 'name', 'role' ])),
  environment: env
}))
对于每个环境,返回一个包含所需关键点的对象,并添加环境道具


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

我相信您可以使用这样一个简单的地图:

[
   { id: 'abc-456', name: 'Homer', role: 'admin', environment: 'dev' },
   { id: 'abc-456', name: 'Homer', role: 'admin', environment: 'non-prod' }
]
const userList = _.map(api_response.environment_list, (env) => ({
  ...(_.pick(api_response.member_list, ['id', 'name', 'role' ])),
  environment: env
}))
对于每个环境,返回一个包含所需关键点的对象,并添加环境道具


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

我决定继续使用下面的命令来展开列表:``.flatte(extendAndMergeList)“``它正在做我想做的事情。但我肯定我可能在这里做了一些有趣的事情。请查看我答案的第二部分,我相信这是最好的方法,因为在这种情况下,lodash可能有点无效。(Flatte在代码中添加了一些其他操作)我决定继续使用下面的方法将列表展平:“展平(extendAndMergeList)”,它正在做我想做的事情。但我肯定我可能在这里做了一些有趣的事情。看看我答案的第二部分,我相信这是最好的方法,因为lodash在这种情况下可能有点效率低下。(Flatte在您的代码中添加了更多操作)这很好,这正是我想要的。非常感谢。我认为值得指出的是,您不需要lodash,可以使用
Array.prototype.flat()
是的!你说得对!谢谢!这太棒了,这正是我要找的。非常感谢。我想值得指出的是,你不需要lodash,可以使用
Array.prototype.flat()
是的!你说得对!谢谢!