用键在对象中查找特定值,但我不知道路径

时间:2019-02-15 13:32:33

标签: javascript

我有一个像这样的对象: 只是举例而已。...

{a:"aaaa", 
 b:{ 
    b1:"1b1b1b", 
    b2:"2bb22b",
    b3:{
        mykey:"value to find",
        some:"same",
        },
    },
 }

我知道键“ mykey”,但是我不知道它在哪里,我也不知道路径... 我不能用这种方式来找到价值...

myObj.a.b.maykey

因为我不知道钥匙“ mykey”在哪里 我只知道我的钥匙里有这个钥匙

我必须找到“找到的价值”, 如何找到myKey的值?

谢谢

2 个答案:

答案 0 :(得分:1)

假设您知道密钥是myKey,并且您正在对象图中某个地方寻找它,一个选择是使用深度优先遍历递归函数(类似于DOM用于{{ 1}})。这比顾名思义要简单得多。 :-)查看评论:

querySelector

如果找不到,则返回function findFirstValue(data, key) { // ASSERTION: data is an object // Loop through the properties of the object for (const [name, value] of Object.entries(data)) { // Found the key? if (name === key) { // Return the value return value; } // If the value is an object, recurse if (typeof value === "object") { const found = findFirstValue(value, key); if (found !== undefined) { // Found during recursion return found; } } } // Not found return undefined; // Explicit, but this is effectively what would happen anyway } const found = findFirstValue({ a: "aaaa", b: { b1: "1b1b1b", b2: "2bb22b", b3: { mykey: "value", some: "same", }, }, }, "mykey"); console.log(found);。您可以改用标志值(这样,如果找到了键,但实际上值是undefined,则可以分辨出该值)。这是对上面的细微调整。但是,如果您可以假设该值实际上不是undefined,则undefined会成为一个很好的标志值。

答案 1 :(得分:1)

您可以通过递归来实现。

let obj = {a:"aaaa", 
 b:{ 
    b1:"1b1b1b", 
    b2:"2bb22b",
    b3:{
        mykey:"value",
        some:"same",
        },
    },
 }

function find(obj,givenKey){
  for(let key in obj){
    //checks if key's value is object 
    if(typeof obj[key] === "object"){ 
    //find 'givenKey' inside that object
      let keyValue = find(obj[key],givenKey)
      //if 'givenKey' is found in that object 
      if(keyValue){
        //return that key's value
        return keyValue
      }
    }
    //if key's value is not object 
    else{
      //if key match given key then it return the value of key
      if(key === givenKey) return obj[key]
    }
  }
}
console.log(find(obj,'mykey'))