编写一个函数,计算一个键在对象中出现的次数。
// var testobj = {'e': {'x':'y'}, 't':{'r': {'e':'r'}, 'p': {'y':'r'}},'y':'e'};
// countKeysInObj(testobj, 'r') // 1
// countKeysInObj(testobj, 'e') // 2
这是我的代码,但它不起作用:
var countKeysInObj = function(obj, key) {
var num = 0;
for (var prop in obj) {
if (prop === key) {
num++;
}
var value = obj[prop];
if (typeof value === 'object') {
return countKeysInObj(value, key);
}
}
return num;
};

答案 0 :(得分:1)
您需要添加递归调用的结果。并且仅在函数结束时返回,因为任何嵌套对象都会破坏循环。
var testobj = { 'e': { 'x': 'y' }, 't': { 'r': { 'e': 'r' }, 'p': { 'y': 'r' } }, 'y': 'e' },
countKeysInObj = function(obj, key) {
var num = 0;
for (var prop in obj) {
if (prop === key) {
num++;
}
var value = obj[prop];
if (typeof value === 'object') {
num += countKeysInObj(value, key); // add to num!
}
}
return num;
};
document.write(countKeysInObj(testobj, 'r') + '<br>');
document.write(countKeysInObj(testobj, 'e') + '<br>');
&#13;
答案 1 :(得分:1)
问题在于您return
而不是num+=
var countKeysInObj = function(obj, key) {
var num = 0;
for (var prop in obj) {
if (prop === key) {
num++;
}
var value = obj[prop];
if (typeof value === 'object') {
num += countKeysInObj(value, key);
}
}
return num;
};
答案 2 :(得分:0)
要添加到之前的答案:您可以使用Object.keys
和Array.filter
来计算密钥。 ES2015示例:
'use strict';
let result = document.querySelector('#result');
let testobj = { 'e': { 'x': 'y' },
't': { 'r': { 'e': 'r' },
'p': { 'y':'r', 'r': {'r': '5'} } },
'y': 'e' };
let resultStr = 'Full depth frequency in testObj for key';
result.textContent = `${resultStr} 'r': ${countAllKeysInObject(testobj, 'r')}
${resultStr} 'e': ${countAllKeysInObject(testobj, 'e')}`;
function countAllKeysInObject(obj, findKey) {
let keyFreq = currentObj => Object.keys(currentObj)
.filter( key => key === findKey ).length;
let nKeys = keyFreq(obj);
let count = obj => {
for (let l in obj) {
nKeys += keyFreq(obj[l]);
obj[l] instanceof Object && count(obj[l]);
}
return nKeys;
};
return count(obj);
}
<pre id="result"></pre>