You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何计算JSON对象中所有键与值的总数量?

如何统计嵌套对象中所有键和值的总数量

嘿,我来帮你搞定这个问题~首先得纠正个小细节:你给出的其实是嵌套的JavaScript对象(不是JSON数组,JSON数组是用[]包裹的),不过这不影响我们统计哈。

针对你提到的期望结果21或18,我分两种情况给你对应的解决方案:

情况1:统计所有层级的键 + 所有值的数量(结果=21)

这个结果的计算逻辑是:外层对象的3个键 + 3个内层对象各有的3个键(共9个) + 内层对象的9个值 → 3+9+9=21。

我们可以用递归遍历的方式实现,不管对象嵌套多少层都能统计:

function countAllKeysAndValues(obj) {
  let total = 0;
  // 遍历对象的每一个键值对
  for (const key in obj) {
    // 确保只统计对象自身的属性(不包括原型链上的)
    if (obj.hasOwnProperty(key)) {
      total++; // 先把当前键算进去
      const value = obj[key];
      if (typeof value === 'object' && value !== null) {
        // 如果值是对象,递归统计里面的键和值
        total += countAllKeysAndValues(value);
      } else {
        total++; // 非对象类型的直接统计为1个值
      }
    }
  }
  return total;
}

// 用你的示例测试
var nestedObj = { 
  '-1': { '-1': 'b', '2': 'a', '10': 'c' }, 
  '2': { '-1': 'a', '2': 'b', '10': 'a' }, 
  '5': { '-1': 'a', '2': 'a', '10': 'b' } 
};
console.log(countAllKeysAndValues(nestedObj)); // 输出 21

情况2:仅统计内层对象的键和值(结果=18)

如果你的需求是只统计内层的内容,那就是9个内层键 + 9个内层值 → 18。这种情况可以直接遍历外层对象的每个值(也就是内层对象),再统计它们的键值:

function countInnerKeysAndValues(obj) {
  let total = 0;
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      const innerObj = obj[key];
      // 遍历内层对象的键值对
      for (const innerKey in innerObj) {
        if (innerObj.hasOwnProperty(innerKey)) {
          total++; // 统计内层键
          total++; // 统计内层值
        }
      }
    }
  }
  return total;
}

console.log(countInnerKeysAndValues(nestedObj)); // 输出 18

额外补充:如果值是字符串要统计字符数?

要是你想把字符串类型的值按字符长度统计(比如值'abc'算3个而不是1个),可以修改递归函数里的值统计逻辑:

function countKeysAndValueChars(obj) {
  let total = 0;
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      total++; // 统计键
      const value = obj[key];
      if (typeof value === 'object' && value !== null) {
        total += countKeysAndValueChars(value);
      } else if (typeof value === 'string') {
        total += value.length; // 统计字符串的字符数
      } else {
        total++; // 其他类型值算1个
      }
    }
  }
  return total;
}

内容的提问来源于stack exchange,提问作者Shenya

火山引擎 最新活动