如何计算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




