Javascript 基于阵列创建新阵列
我有一个数组,如下所示:Javascript 基于阵列创建新阵列,javascript,arrays,Javascript,Arrays,我有一个数组,如下所示: const data = [ { new_id: "56", old_id: "229", ratio: "0.1", week: "20" }, { new_id: "55", old_id: "56,96", ratio: "0.2,0.4", week: "20" } ]; 我希望新阵列的外观如下所示: const expectedData = [ { new_id: "56", old_id: "229", ratio: "0.1", week: "20
const data = [
{ new_id: "56", old_id: "229", ratio: "0.1", week: "20" },
{ new_id: "55", old_id: "56,96", ratio: "0.2,0.4", week: "20" }
];
我希望新阵列的外观如下所示:
const expectedData = [
{ new_id: "56", old_id: "229", ratio: "0.1", week: "20" },
{ new_id: "55", old_id: "56", ratio: "0.2", week: "20" },
{ new_id: "55", old_id: "96", ratio: "0.4", week: "20" }
];
我写了一些代码,但现在我卡住了
const result = data.map(data => {
return {
...data,
old_id: data.old_id.split(","),
ratio: data.ratio.split(",")
};
});
如何解决这个问题?您可以采取一种方法,同时映射旧id
/比率
const
数据=[{新id:“56”,旧id:“229”,比率:“0.1”,周数:“20”},{新id:“55”,旧id:“56,96”,比率:“0.2,0.4”,周数:“20”},
keys=['old_id','ratio'],
result=data.flatMap(o=>keys.reduce((r,k,j)=>{
o[k].split(',').forEach((v,i)=>{
r[i]=r[i]|{……o};
r[i][key[j]]=v;
});
返回r;
}, []));
控制台日志(结果)代码>
.as console wrapper{max height:100%!important;top:0;}
您可以使用Array.reduce()
在迭代中迭代并使用for…of
循环,如下所示:
const数据=[{
新编号:“56”,
旧身份证:“229”,
比率:“0.1”,
周:“20”
},
{
新身份证号码:“55”,
旧身份证:“56,96”,
比率:“0.2,0.4”,
周:“20”
}
];
const newData=data.reduce((acc,cur)=>{
让old_id=cur.old_id.split(','))
let ratios=当前比率拆分(',')
for(让[i,old_id]为old_id.entries()){
加速推(
{
…cur,
旧身份证,
比率:比率[i]
}
)
}
返回acc;
}, [])
console.log(newData)
您可以使用reduce
方法检查旧\u id
是否包含,
,然后只需推送所需的项目:
const result = data.reduce((a,c)=>{
let splittedOld_id = c.old_id.split(',');
splittedOld_id.forEach((el, i)=>{
a.push({new_id: c.new_id, old_id: el, ratio: c.ratio.split(',')[i], week: c.week});
});
return a;
}, []);
例如:
const数据=[
{新id:“56”,旧id:“229”,比率:“0.1”,周数:“20”},
{新id:“55”,旧id:“56,96”,比率:“0.2,0.4”,周数:“20”}
];
常量结果=数据减少((a,c)=>{
设splittedOld_id=c.old_id.split(',');
拆分的旧id.forEach((el,i)=>{
a、 push({new_id:c.new_id,old_id:el,ratio:c.ratio.split(',')[i],week:c.week});
});
返回a;
}, []);
控制台日志(结果)编码>如果您想从一个数组中获得另一个具有不同元素数的数组,请始终考虑减少
以下是我的解决方案代码:
data.reduce((prev, curr) => {
const splittedRatio = curr.ratio.split(',');
const splittedOldId = curr.old_id.split(',');
const newData = [];
splittedRatio.forEach((rat, i) => {
newData.push({
...curr,
ratio: rat,
old_id: splittedOldId[i]
});
});
return prev.concat(newData)
}, []);
你可以用
const data=[{new_id:“56”,old_id:“229”,ratio:“0.1”,week:“20”},{new_id:“55”,old_id:“56,96”,ratio:“0.2,0.4”,week:“20”}]
const result=data.reduce((a,{new_id,old_id,ratio,week})=>
[…旧id.split(',').map((id,i)=>({新id,旧id:id,ratio:ratio.split(',')[i],week})),…a],])
console.log(结果)
。作为控制台包装{max height:100%!important;top:0;}
另一个版本使用reduce
,拆分
并使用逗号运算符
const数据=[
{新id:“56”,旧id:“229”,比率:“0.1”,周数:“20”},
{新id:“55”,旧id:“56,96”,比率:“0.2,0.4”,周数:“20”}
];
const updated=data.reduce(
(会计科目,当前)=>(
(比率=拆分的当前比率(“,”),
当前旧id
.拆分(“,”)
.forEach((old_id,i)=>acc.push({…curr,old_id,ratio:rations[i]})),
行政协调会
),
[]
);
控制台日志(更新)
你的问题有点模糊,但如果我理解正确,你想用第二行的第二个值创建一个新行吗?我想说——如果你想让你的代码可读的话——使用比o
、r
、k
和j
更多的描述性名称。)