Javascript 过滤对象关键点并创建新的嵌套关键点

Javascript 过滤对象关键点并创建新的嵌套关键点,javascript,arrays,object,lodash,Javascript,Arrays,Object,Lodash,我有一组参数,如下所示: [param1, param2_experience, param3] [ { id: 123, param1: { issue: "some", star: 5 }, param2_experience: { time_taken: "45 minutes" }, param3: { issue_other: "some other" } }, {

我有一组参数,如下所示:

[param1, param2_experience, param3]
[
  {
    id: 123,
    param1: {
      issue: "some",
      star: 5
    },
    param2_experience: {
       time_taken: "45 minutes"
    },
    param3: {
       issue_other: "some other"
    }
  },
  {
    id: 456,
    param1: {
      issue: "some issue",
      star: 3.5
    },
    param3: {
       issue_other: "some other issue"
    }
  }
]
我还有另一组对象,如下所示:

[
  {
    id: 123,
    param1_issue: "some",
    param1_star: 5,
    param2_experience_time_taken: "45 minutes",
    param3_issue_other: "some other"
  },
  {
    id: 456,
    param1_issue: "some issue",
    param1_star: 3.5,
    param3_issue_other: "some other issue"
  }
]
我想在第一个数组的基础上拆分这个数组。大概是这样的:

[param1, param2_experience, param3]
[
  {
    id: 123,
    param1: {
      issue: "some",
      star: 5
    },
    param2_experience: {
       time_taken: "45 minutes"
    },
    param3: {
       issue_other: "some other"
    }
  },
  {
    id: 456,
    param1: {
      issue: "some issue",
      star: 3.5
    },
    param3: {
       issue_other: "some other issue"
    }
  }
]

有什么更好的方法?此数组可以包含数千个对象

您可以
将数组中的每个元素映射到具有第一个数组格式的新对象

var key=[“param1”、“param2_经验”、“param3”];
var数据=[{“id”:123,“param1_问题”:“一些”,“param1_星”:5,“param2_经验_时间”:“45分钟”,“param3_问题_其他”:“一些其他”},{“id”:456,“param1_问题”:“一些问题”,“param1_星”:3.5,“param3_问题_其他”:“一些其他问题”};
var输出=389;.map(数据,e=>{
var obj={};
_.forIn(e,(val,key)=>{
var bucket=\.find(key,k=>\.startsWith(key,k));
_.set(obj,
水桶
?[bucket,key.slice(bucket.length+1)]
:键,
val);
});
返回obj;
});
控制台日志(输出)

您可以
将数组中的每个元素映射到具有第一个数组格式的新对象

var key=[“param1”、“param2_经验”、“param3”];
var数据=[{“id”:123,“param1_问题”:“一些”,“param1_星”:5,“param2_经验_时间”:“45分钟”,“param3_问题_其他”:“一些其他”},{“id”:456,“param1_问题”:“一些问题”,“param1_星”:3.5,“param3_问题_其他”:“一些其他问题”};
var输出=389;.map(数据,e=>{
var obj={};
_.forIn(e,(val,key)=>{
var bucket=\.find(key,k=>\.startsWith(key,k));
_.set(obj,
水桶
?[bucket,key.slice(bucket.length+1)]
:键,
val);
});
返回obj;
});
控制台日志(输出)

我想你可以这样做

var arr=[“param1”、“param2_经验”、“param3”],
brr=[
{id:123,param1_问题:“一些”,param1_星:5,param2_经验时间:“45分钟”,param3_问题:“其他一些”},
{id:426,param1_问题:“一些问题”,param1_星:3.5,param3_问题:“一些其他问题”}
],
merged=brr.map(o=>{var obj={id:o.id};
for(变量输入o){
arr.forEach(k=>{var prob=key.split(k+“”)[1];
prob!==void 0&&(!obj[k]?obj[k]={[prob]:o[key]}
:obj[k][prob]=o[key];
});
}
返回obj;
});

console.log(合并)我想你可以这样做

var arr=[“param1”、“param2_经验”、“param3”],
brr=[
{id:123,param1_问题:“一些”,param1_星:5,param2_经验时间:“45分钟”,param3_问题:“其他一些”},
{id:426,param1_问题:“一些问题”,param1_星:3.5,param3_问题:“一些其他问题”}
],
merged=brr.map(o=>{var obj={id:o.id};
for(变量输入o){
arr.forEach(k=>{var prob=key.split(k+“”)[1];
prob!==void 0&&(!obj[k]?obj[k]={[prob]:o[key]}
:obj[k][prob]=o[key];
});
}
返回obj;
});
console.log(合并)您可以使用和来迭代集合和每个集合的项,同时返回集合中新转换的对象。这里的关键点是使用替换键的第一个

var数据=[
{
id:123,
param1_问题:“一些”,
param1_星:5,
参数2经验时间:“45分钟”,
param3_问题_其他:“其他一些”
},
{
身份证号码:456,
param1_问题:“一些问题”,
param1_星:3.5,
param3_问题_其他:“其他问题”
}
];
var result=\映射(数据、函数(项){
返回减少(项、函数(结果、值、键){
返回设置(结果,键替换(“,”)、值);
}, {});
});
document.write(“”+JSON.stringify(结果,0,4)+“”)
您可以使用和迭代集合和每个集合的项,同时返回集合中新转换的对象。这里的关键点是使用替换键的第一个

var数据=[
{
id:123,
param1_问题:“一些”,
param1炣星:5,
参数2经验时间:“45分钟”,
param3_问题_其他:“其他一些”
},
{
身份证号码:456,
param1_问题:“一些问题”,
param1_星:3.5,
param3_问题_其他:“其他问题”
}
];
var result=\映射(数据、函数(项){
返回减少(项、函数(结果、值、键){
返回设置(结果,键替换(“,”)、值);
}, {});
});
document.write(“”+JSON.stringify(结果,0,4)+“”)

你能发布你当前的代码吗?只需在你的对象数组中循环创建一个新的对象,然后将其添加到常规数组中。我可以用jquery@gcampbell代码还不完整,我当时的做法对我来说似乎并不正确。所以我一直在寻找其他方法来做这件事。@Kabali不。这必须在后端完成。我正在使用lodash。你能发布你当前的代码吗?只需在你的对象数组中循环并创建一个新的单个对象,然后将其添加到常规数组中。我可以使用jquery@gcampbell代码还不完整,我当时的做法对我来说似乎并不正确。所以我一直在寻找其他方法来做这件事。@Kabali不。这必须在后端完成。我正在使用lodash。如果在对象数组中有一些额外的参数呢?我添加了一个
else
f