如何递归地计算对象中出现的目标键(属性)的数量?

时间:2016-05-06 07:02:21

标签: javascript recursion

编写一个函数,计算一个键在对象中出现的次数。

// 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;
};




3 个答案:

答案 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;
&#13;
&#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.keysArray.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>