繁体   English   中英

通过在 javascript 中重新格式化来减少数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM