javascript 在while循环中将对象推入对象内部

lnlaulya  于 2023-05-21  发布在  Java
关注(0)|答案(1)|浏览(111)
let num = 6;
if (num < 13 && num > 1) {
  let base = 1;
  let remaining = num - 1;
  let result = {
    l: num,
    r: remaining
  };
  while (remaining <= 12 && remaining >= 1) {
    let o = {
      l: num,
      r: remaining
    }
    result["r"] = o;
    console.log(result, o);
    remaining--
  }
  console.log(result)
  //return result;
} else {
  throw new Error('Invalid number');
}

我想循环6次,在result中,result的r键必须在object中有object。number应该大于12或小于1,并希望将o推入r 6次。我尝试过像object.key或object[key]这样的对象访问,但现在很困惑
输出我想要喜欢

{l:num,r:{l:num,r{...so on 6 times}}}
px9o7tmv

px9o7tmv1#

您的result对象总是会覆盖相同的r属性。相反,您可能希望有一个对象引用,指向分配给r属性的新对象,以便在下一次迭代中,该嵌套对象的r属性被展开,而不是顶层的r属性。
需要作出两项修改-见评论:

let num = 6;
if (num < 13 && num > 1) {
  let base = 1;
  let remaining = num - 1;
  let result = {
    l: num,
    r: remaining
  };
  let r = result; // Keep track of the innermost object  
  while (remaining <= 12 && remaining >= 1) {
    let o = {
      l: num,
      r: remaining
    }
    r = r.r = o; // r should "follow" the newly created object
    remaining--
  }
  console.log(result)
} else {
  throw new Error('Invalid number');
}

请注意,对象文字中的r: remaining创建了一个属性,该属性在下一次迭代中被语句r.r = o覆盖,因此只有最后创建的对象才能为remaining分配有用的值(始终为1)。
这项工作可以通过一种更优雅的方式来完成,即从内到外创建对象,每次都将一个新对象 Package 在先前创建的对象周围。reduce是一个方便的方法:

const createNested = l =>
    Array.from({length: l}).reduce(r => ({ l, r }), 1);

console.log(createNested(6));

这也可以通过显式循环来完成:

const createNested = l => {
    let r = 1;
    for (let i = 0; i < l; i++) r = { l, r };
    return r; 
}
console.log(createNested(6));

相关问题