[英]Reduce a array with reformatting in javascript
我想减少数组,只有新的 object 中存在主题。
array = [{
subject: "maths",
credits: 3
},
{
subject: "chemistry",
credits: 2,
lab: {
lab: "chemistry_lab",
lab_credits: 1,
},
}
]
新的 object 被重新格式化,其值被分配为字符串。 实现这一目标的最佳方法是什么
const subject = {
maths: "",
chemistry: "",
chemistry_lab: "",
};
这是我尝试过的方法,但它返回一个对象数组,但我希望这是一个如上所述的单个 object
const sub = array.map((op) => {
const container = {};
container[op.subject] = "";
return container;
});
您的 map 方法是正确的想法,但是,它不是 map lab
对象。 您可以 go 使用.flatMap()
从数组中的每个 object 构建[key, value]
对的数组。 通过平面映射,您可以获取每个主题和实验室(如果存在)并将 object “转换”为两个 arrays 键值。 然后,您可以过滤此映射数组以删除键为假值(即:未定义)的任何[key, value]
对,然后在 [ key
[key, value]
对 arrays 的数组上使用Object.fromEntries()
来构建一个 object 给你。
const array = [{ subject: "maths", credits: 3 }, { subject: "chemistry", credits: 2, lab: { lab: "chemistry_lab", lab_credits: 1, }, } ]; const res = Object.fromEntries(array.flatMap(obj => [ [obj.subject, ''], [obj.lab?.lab, ''] ]).filter(([key]) => key)); console.log(res);
另一种选择是删除.filter()
,并在添加实验室[key, value]
对之前检查.flatMap()
function。 这将帮助您避免对数组进行额外的迭代:
const array = [{ subject: "maths", credits: 3 }, { subject: "chemistry", credits: 2, lab: { lab: "chemistry_lab", lab_credits: 1, }, } ]; const res = Object.fromEntries(array.flatMap( obj => obj.lab?.lab? [[obj.subject, ''], [obj.lab.lab, '']]: [[obj.subject, '']] )); console.log(res);
最后,使用.reduce()
的方法可能看起来像这样。 它构建了一个 object,使用计算的属性名称将主题添加为键,如果存在则添加实验室。 它使用传播语法传播curr.lab?.lab && {[curr.lab.lab]: ''}
的结果。 当 cur.lab.lab 结果为真值时,object 被传播并合并到返回的 object 文字中:
const array = [{ subject: "maths", credits: 3 }, { subject: "chemistry", credits: 2, lab: { lab: "chemistry_lab", lab_credits: 1, }, } ]; const res = array.reduce((obj, curr) => ({...obj, [curr.subject]: '', ...(curr.lab?.lab && {[curr.lab.lab]: ''}) }), {}); console.log(res);
let array = [{ subject: "maths", credits: 3 }, { subject: "chemistry", credits: 2, lab: { lab: "chemistry_lab", lab_credits: 1, }, } ] let subject = {} array.forEach(el => { subject[el.subject] = "" if (el.lab) { subject[el.lab.lab] = "" } }) console.log(subject) // output // { maths: "", chemistry: "", chemistry_lab: "" }
var array = [ { subject: "maths", credits: 3 }, { subject: "chemistry", credits: 2, lab: { lab: "chemistry_lab", lab_credits: 1, }, } ]; var p = array.reduce((acc,i)=>{ acc[i.subject]= ''; if(i.lab){ acc[i.lab.lab]='' } return acc; },{}) console.log(p)
您也可以使用 JavaScript reduce
来实现相同的效果。
这是您可以尝试的片段:
var p = array.reduce((acc,i)=>{
acc[i.subject]= '';
if(i.lab){
acc[i.lab.lab]=''
}
return acc;
},{})
console.log(p)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.