基于一个数组创建新的数组

3

我有一个如下的数组:

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(",")
  };
});

如何解决这个问题?

你的问题有点模糊,但如果我理解正确的话,你想要一个包含第二行第二个值的新行? - Giesburts
6个回答

4
你可以采用 Array#flatMap 的方法,同时对 old_id/ratio 进行映射。

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" }],
    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][keys[j]] = v;
        });
        return r;
    }, []));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


3
我会说 - 如果你想让你的代码易读性更高 - 使用比 orkj 更具描述性的名称即可 ;) - pbialy

2
您可以使用Array.reduce()来迭代并在迭代中使用for...of循环,如下所示:

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 newData = data.reduce((acc, cur) => {
  let old_ids = cur.old_id.split(',')
  let ratios = cur.ratio.split(',')
  for(let [i, old_id] of old_ids.entries()){
    acc.push(
    {
      ...cur,
      old_id,
      ratio: ratios[i]
    }
    )
  }
  return acc;
}, [])

console.log(newData)


1
您可以使用 reduce 方法来检查 old_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 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,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;
 }, []);

 console.log(result);


0

你可以使用Array.prototype.reduce()

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 }) =>
  [...old_id.split(',').map((id, i) => ({ new_id, old_id: id, ratio: ratio.split(',')[i], week })), ...a], [])

console.log(result)
.as-console-wrapper { max-height: 100% !important; top: 0; }


0

使用reducesplit和逗号运算符的另一个版本。

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 updated = data.reduce(
  (acc, curr) => (
    (ratios = curr.ratio.split(",")),
    curr.old_id
      .split(",")
      .forEach((old_id, i) => acc.push({ ...curr, old_id, ratio: ratios[i] })),
    acc
  ),
  []
);

console.log(updated);


0

如果你想从一个数组中获取另一个具有不同元素数量的数组,那么一定要考虑使用 reduce

这是我解决问题的代码:

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)
}, []);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接