使用递归

时间:2017-08-10 17:06:48

标签: javascript oop for-loop recursion data-structures

当我将伪对象应用于函数时,我的算法正常工作,但在CodeWars上它继续失败。我很好奇我的代码中缺少哪些检查。我相信我必须使用某些正则表达式,但我很困惑。这是问题https://www.codewars.com/kata/get-root-property-name

的链接
function getRootProperty(object, val) {
var valueFound = false;
let output = '';
 for (var first in object) {
 var seachObject = object[first]
  function query(object, val, rootName) {
    Object.getOwnPropertyNames(object).forEach((value) => {
      if (object[value] == val) {
        valueFound = true;
        output = rootName
        return
      } else {
        query(object[value], val, rootName)
      }
    })
}
  query(seachObject, val, first);
}

if (valueFound == false) {
   return null
} else {
   return output;
}

}

2 个答案:

答案 0 :(得分:0)

幸运的是,我只需要搜索新的CodeWars问题并发现它相对较快:Problem description。这是您的问题:[...] other root properties may also have 9 buried in it but you should always return the first

使用if (!valueFound) query(object[value], val, rootName)进行第一次呼叫(与递归呼叫无关)。

该问题假定javascript属性中的顺序在ecmascript8中有效,部分在ecmascript6中,在较低版本中根本没有。

答案 1 :(得分:0)

你也可以这样做;



function findRootProperty(o,x,p = this){
  return Object.keys(o)
               .reduce((r,k) => Array.isArray(o[k]) ? o[k].includes(x) ? r.concat(k)
                                                                       : r
                                                    : r.concat(findRootProperty(o[k],x,k)),[])
               .map(q => p === this ? q : p );
}

object = {
    "r1n": {
        "mkg": {
            "zma": [21, 45, 66, 111],
            "mii": {
                "ltf": [2, 5, 3, 9, 21]
             },
             "fv": [1, 3, 6, 9]
         },
         "rmk": {
             "amr": [50, 50, 100, 116, 150, 250]
         }
    },
    "fik": {
        "er": [592, 92, 32, 13],
        "gp": [12, 34, 116, 29]
    }
};

console.log(findRootProperty(object,116))