javascript - 如何递归地查找嵌套对象中值的键

标签 javascript arrays object recursion

我想通过递归查找 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/

相关文章:

javascript - 继承类似 jQuery 的模式

javascript - 使用 JS 将 JSON 文件发送到 Express 服务器

c - 如何从C中的字符数组中获取 "substring"

delphi - 如何在运行时在 FireMonkey 中使用鼠标选择 3D 对象

Facebook:如何从 url 获取对象 ID

JavaScript XMLHttpRequest() 和重定向

java - 在java中将A字节转换为ASCII字符

javascript - 使用 lodash 按键对数组中的对象进行排序

javascript - 迭代遍历嵌套对象中的所有节点(不使用递归)

javascript - Rails : After input, 显示差异