【发布时间】:2019-08-27 14:06:24
【问题描述】:
我想通过递归在 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 的值然后中断?
我觉得 result 应该能够在调用堆栈中冒泡,直到它在第一个函数调用处返回而不必中断。
【问题讨论】:
-
如果有多个值怎么办?
-
@briosheje 我只需要第一个。
-
数据集是否一致?我们可能会遇到数组或输入是数组吗?
-
@briosheje 我们可能会遇到数组,但输入始终是一个对象。
-
您可能希望看到这个问题及其答案,以解决更广泛的问题,即找到一个值的整个匹配路径(例如,上面的 ['data1', 'data2', 'data3']可能加入'data1.data2.data3'):stackoverflow.com/q/56066101
标签: javascript arrays object recursion