首页 > 解决方案 > 动态遍历未知深度的对象的键

问题描述

我有一个奇怪的问题——可能是一个愚蠢的问题——需要一些解释,所以请多多包涵。基本上,我想知道是否有一种方法可以在不使用递归的情况下在 JavaScript 中遍历未知深度的对象。

例如,假设我有一个未知深度的对象。它看起来像这样:

let obj_depth2 = {
  male:
    { short: 0, tall: 0 },
  female:
    { short: 0, tall: 0 }
  }

或者可能是这样的:

let obj_depth3 = {
  male: {
    short:
      { basketball: 0, soccer: 0 },
    tall:
      { basketball: 0, soccer: 0 }
  },
  female: {
    short:
      { basketball: 0, soccer: 0 },
    tall:
      { basketball: 0, soccer: 0 }
  }
}

obj也可能更深。我不会提前知道它的深度。

让我们进一步假设我将有一个arr看起来像这样的东西,并且将匹配obj长度的深度。

let arr_depth2 = ["male", "short"];

或者

let arr_depth3 = ["male", "tall", "basketball"];

我将有一个循环,在其中生成 1,000 个这些arrs,然后我将使用这些 s 添加1obj未知深度。所有arrs 的长度都相同(2 或 3 或更多),并且始终与 s 的深度匹配obj。但是深度会发生变化,我想编写一个函数来涵盖所有情况。

需要明确的是,我不会遇到obj深度为 2 且arr长度为 3 的情况。深度和长度将始终匹配一次所有 1,000 次迭代。

我的问题是这个。有没有办法在不使用递归的情况下遍历obj添加1到我需要达到的“最深”键值对的值?

我可以建造这样的东西吗?

obj["male"]["short"] += 1;

虽然我知道我可以使用递归来达到 的底部深度obj,添加1到正确的value,并且随着递归函数继续return重建,这意味着我每次都必须为每个单个值重建 并覆盖I将只是建立在上一次迭代的基础上,只是为了添加到. 只是看起来很糟糕,但也许没关系。objreturnobjobj1obj

先感谢您。

标签: javascriptarraysrecursionjavascript-objects

解决方案


您可以这样做.reduce()来遍历您的对象,累加器在您的遍历中跟踪您当前的对象。当你的 reduce 完成后,它会在你的路径中拥有最内层的嵌套对象,然后你可以使用数组中的最后一个元素作为修改值的键。正如您所说,如果您对简单地改变原始对象感到满意,则无需递归:

const obj = {male:{short:{basketball:0,soccer:0},tall:{basketball:0,soccer:0}},female:{short:{basketball:0,soccer:0},tall:{basketball:0,soccer:0}}}
const arr = ["male", "tall", "basketball"];

const modify = (obj, [...keys]) => {
  const last_key = keys.pop();        
  const last_obj = keys.reduce((o, k) => o[k], obj);
  last_obj[last_key] += 1;
}

modify(obj, arr);
console.log(obj);


推荐阅读