动态遍历未知深度键的对象

时间:2019-12-04 00:52:00

标签: javascript arrays recursion javascript-objects

我有一个奇怪的问题-可能是一个愚蠢的问题-需要一些解释,所以请耐心等待。基本上,我想知道是否有一种方法可以在不使用递归的情况下遍历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"];

我将有一个循环,可以生成1000个arr,然后将这些1添加到未知深度的obj中。所有arr的长度都相同(2或3,或更多),并且始终与obj的深度匹配。但是深度会改变,我想编写一个函数来涵盖所有情况。

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

我的问题是这个。有没有一种方法可以遍历obj并将1添加到我不使用递归就需要到达的“最深”键值对的值中?

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

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

尽管我知道我可以使用递归来达到obj的底部深度,将1添加到适当的value,然后return来重建{{ 1}},因为递归函数继续运行到obj,这意味着我每次都必须为每个单个值重建return并覆盖我以前构建的obj迭代,只需将obj添加到1的一部分中即可。 似乎不好,但是也许没关系。

谢谢。

4 个答案:

答案 0 :(得分:1)

您可以使用.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);

答案 1 :(得分:1)

如果要在适当位置修改对象,则可以使用指针将对象遍历到最后一个键的位置,然后对其进行设置。

using

答案 2 :(得分:0)

您可以使用reduce函数在描述的情况下安全地访问嵌套对象:

const getNestedObject = (nestedObj, pathArr) => {
    return pathArr.reduce((obj, key) =>
        (obj && obj[key] !== 'undefined') ? obj[key] : undefined, nestedObj);
}

然后,您可以通过类似的方式访问所需的['male'] ['short']对象:

let shortMale = getNestedObject(obj_depth3, ['male', 'short'])

您可以在对象上执行所需的操作:

shortMale.basketball += 1

有关getNestedObject函数的更多信息,请参见:https://hackernoon.com/accessing-nested-objects-in-javascript-f02f1bd6387f

答案 3 :(得分:0)

这是一个公式,一旦您可以在JavaScript中调用文件夹名称,就可以获取大小未知的东西的所有部分 Object.entries(yourObject) 这将返回对象的所有数据的数组,因此您可以轻松地对其进行迭代。我将在示例中返回您的数据,以向您展示Object.entries的工作方式

const obj_depth3 = {
  male: {
    short:
      { basketball: 0, soccer: 0 },
    tall:
      { basketball: 0, soccer: 0 }
  },
  female: {
    short:
      { basketball: 0, soccer: 0 },
    tall:
      { basketball: 0, soccer: 0 }
  }
}
console.log(Object.entries(obj_depth3));
//you might still want to use another console like inspect element's own to see how the array works, but it has all the depth and stuff :)