我想通过递归查找 Javascript 嵌套对象中值的键。
这是我对该功能的尝试。有更优雅的方法来实现这个吗?
const foo = { data: { data2: { data3: 'worked' }, data21: 'rand' }, data01: 'rand01' }
function findKey(obj, target) {
let result = null;
if (_.isEmpty(obj) || !_.isObject(obj)){
return null;
}
if (!_.isArray(obj) && Object.keys(obj).length > 0) {
for(let i=0; i < Object.keys(obj).length; i++){
let key = Object.keys(obj)[i];
let val = obj[key];
if (val === target) {
return key;
}else{
result = findKey(val, target);
}
if (result) {break}
}
}
return result;
}
console.log(findKey(foo, 'worked'))
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
例如,有没有办法避免检查 result
的值然后中断?
我觉得结果应该能够在调用堆栈中向下冒泡,直到它在第一个函数调用时返回,而不必中断。
最佳答案
最近又重新提出了这一点,但没有提到一项有用的技术,即生成器函数。它们通常会简化需要提前停止的递归遍历。这里我们将问题分解为两个函数。一,生成器函数nestedEntries
获取对象中的所有(嵌套)键值对。另一个调用它并返回第一个与提供的目标值匹配的值。
function * nestedEntries (obj) {
for (let [k, v] of Object .entries (obj)) {
yield [k, v]
if (Object (v) === v) {yield * nestedEntries (v)}
}
}
const findKey = (obj, target) => {
for (let [k, v] of nestedEntries (obj)) {
if (v === target) return k
}
return null
}
const foo = {data01: 'rand01', data: {data21: 'rand', data2: { data3: 'worked' } }}
console .log (findKey (foo, 'worked'))
关于javascript - 如何递归地查找嵌套对象中值的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57676477/