【问题标题】:count the total number of keys from nested objects and arrays计算嵌套对象和数组的键总数
【发布时间】:2022-01-07 03:29:48
【问题描述】:

我有一个嵌套对象,它具有不同类型的属性,包括字符串、对象和数组。我使用递归的方法来计算对象中键的总数(从key1到key9),但未能得到正确的解决方案。下面是我的代码示例。

const data = {
  key1: '1',
  key2: '2',
  key3: { key4: '4' },
  key5: [
    {
      key6: '6',
      key7: '7',
    },
    {
      key8: '8',
      key9: '9',
    }
  ]
}

const countKeys = (data) => {
  let count = 0;

  const helper = (data) => {
    for (let value of Object.values(data)) {
      if (typeof value === 'object') {
        helper(value);
      }
      // this line is problematic as it counts each object in the array as key. 
      if (!Array.isArray(value)) count++;
    }
  }
  helper(data)
  return count;
}
console.log(countKeys(data)) // 10, correct answer is 9

我尝试了好几个小时,但无法找到解决方案。谁能解释一下我在这里缺少什么并应该添加以使其正常工作?

【问题讨论】:

  • 嗨,也许用Object.keys
  • 你到底是如何达到 10 的?如果您神奇地不计算数组索引,我会看到 9,否则为 11。
  • 只是想知道您到底想计算什么? 9 计算从key1key9 的所有项目
  • @jspacal 我认为当我们到达具有数组属性的“key5”时,Object.keys 不会起作用?
  • @ASDFGerte 实际上有一个错字。正确答案应该是 9,但我得到了 10。

标签: javascript arrays object recursion nested


【解决方案1】:

对于提供的数据,有九 (9) 个键。您可以使用递归 countKeys(t) 并对 t 的类型进行类型分析 -

  1. 当它是一个对象时,对于Object.values(t)中的所有v,将递归结果归约并计数加一,countKeys(v)
  2. 当它是一个数组时,对于t 中的所有v,求和countKeys(v)
  3. 否则t既不是对象也不是数组,返回零

function countKeys(t) {
  switch (t?.constructor) {
    case Object:                                     // 1
      return Object
        .values(t)
        .reduce((r, v) => r + 1 + countKeys(v), 0)
    case Array:                                      // 2
      return t
        .reduce((r, v) => r + countKeys(v), 0)
    default:                                         // 3
      return 0
  }
}

const data =
  {key1:"1",key2:"2",key3:{key4:"4"},key5:[{key6:"6",key7:"7"},{key8:"8",key9:"9"}]}

console.log(countKeys(data))

【讨论】:

    猜你喜欢
    • 2020-12-22
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 2020-08-10
    相关资源
    最近更新 更多