Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于阵列创建新阵列_Javascript_Arrays - Fatal编程技术网

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
更多的描述性名称。)