javascript - 在深度嵌套的对象数组中搜索单个键

标签 javascript traversal

我正在尝试搜索一个深度嵌套的数组,并查找其中是否存在某个键。我已经编写了一段进行遍历的代码,但是因为它不是递归的(仅自调用),所以无论是否找到任何东西都无法返回。它只返回 undefined,因为它在其中一个过程中到达了函数的末尾。

我想知道是否有一种方法可以让我在第一次出现特定键时返回 true

这是我到目前为止一直在使用的 JS bin:

https://jsbin.com/qaxuwajuso/edit?js,console

这里是上面示例代码的直接粘贴:

function traverse(item, key) {
    if (typeof item === 'object' && !Array.isArray(item) && item !== null) {
        // Object
        for (let itemKey in item) {
            if (itemKey === key) {
                // Is it possible to return true and break out of the function here?
                console.log('found the key: ' + itemKey + ' With value: ' + item[itemKey]);
            }

            traverse(item[itemKey], key);
        }
    } else if (Array.isArray(item)) {
        // Array
        for (let i = 0; i < item.length; ++i) {
            traverse(item[i], key);
        }
    }
}

如有任何帮助,我们将不胜感激。感谢您的宝贵时间!

最佳答案

当然你只需要返回某种标志来触发循环停止

/*
 * I am trying to search the following json array for any occurance of the key "statePath".
 * In a perfect world I would be able to find the first occurance, and return true from the
 * function.
 *
 * The following data is not real, I was just trying to write as much nested stuff as possible
 * to test that it traverses as far as needed.
 */

const data = [
    {
        id: '2144d998-4c33-4b03-93d2-f6c675b24508',
        element: 'div',
        props: {
            className: 'testing',
            name: [
                {
                    first: 'John',
                    last: {
                        statePath: 'lastName',
                        anArray: [
                          {
                            anObject: {
                              anotherArray: [
                                {
                                  doesItWork: {
                                    statePath: 'hello',
                                  },
                                },
                              ],
                            },
                          },
                        ],
                    },
                },
                {
                    first: 'Jane',
                    last: {
                        statePath: 'lastName',
                    },
                },
            ],
        },
        children: 'hi',
    },
];

function traverse(item, key) {
  if (typeof item === 'object' && !Array.isArray(item) && item !== null) {
    // Object
    for (let itemKey in item) {
      if (itemKey === key) {
        console.log('found the key: ' + itemKey + ' With value: ' + item[itemKey]);
        
        // not sure what you want the end "return" of the func to be, I'm returning the value.  You could return true here instead, you could return a reference to the parent object, lots of possibilities
        return item[itemKey];
      }
      var found = traverse(item[itemKey], key);
      if (found !== undefined) return found;
      // otherwise keep looking
    }
  } else if (Array.isArray(item)) {
    // Array
    for (let i = 0; i < item.length; ++i) {
      var found = traverse(item[i], key);
      if (found !== undefined) return found;
    }
  }
}

var value = traverse(data, 'statePath');
console.log("value is " + value);

关于javascript - 在深度嵌套的对象数组中搜索单个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51990525/

相关文章:

php - PHP中的动态数组遍历

java - 遍历自定义链表

java - JTable:改变遍历顺序

javascript - ( ionic )错误 : [$injector:unpr] Unknown provider: dataServicesProvider <- dataServices <- AuthCtrl

javascript - 如何从外部更改 JavaScript 方法中私有(private)变量的值?

javascript - 如何使用 JavaScript 使 <select> 的 <option> 显示或隐藏?

javascript - 如何等待 .map() 在继续下一行代码之前完成执行

javascript - 这很丑陋,必须有更好的方法在 jQuery 中编写它

javascript - [Vue 警告] : Property or method is not defined on the instance but referenced during render

scala - 在scala中一次迭代实现遍历功能