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