簡體   English   中英

基於數組創建新數組

[英]Create new array based an array

我有一個數組如下:

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

如何解決這個問題?

您也可以采用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; }

您可以使用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)

您可以使用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);

如果您想從一個數組中獲得另一個具有不同元素數量的數組 - 總是考慮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)
}, []);

您可以使用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; }

另一個帶有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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM