[英]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)
}, []);
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; }
另一個帶有reduce
、 split
和使用逗號運算符的版本。
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.