当我将伪对象应用于函数时,我的算法正常工作,但在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;
}
}
答案 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))