简体   繁体   English

搜索嵌套对象中特定键的值

[英]Search for values of a specific key in a nested object

I have this nested object: 我有这个嵌套对象:

{
    "PINS" : {
        "2017" : {
            "Nov-2017" : {
                "VJkRWX7pTSl_5w1Np" : {
                    "pin" : "6K3jP5vLyN",
                    "say": "Hello"
                },
                "MsdsXiO9G9mwM3Qa" : {
                    "pin" : "hnPKh7ywvT",
                    "say": "Hello"
                }
            },
            "Dec-2017" : {
                "Mm35Gjb-nY0k2TV" : {
                    "pin" : "xWwaNNE2XG",
                    "say": "Hello" 
                },
                "WzajCLEJmJHmzg0" : {
                    "pin" : "vMU1mKbZAi",
                    "say": "Hello"
                }
            }
        },
        "2018" : {
            "Jan-2018" : {
                "Wf8E1unVaOh03a43" : {
                    "pin" : "qXJCQREATD",
                    "say": "Hello"
                },
                "JZqP8fVCLSja6J82v" : {
                    "pin" : "o5D8S8Lvtb",
                    "say": "Hello"
                }
            },
            "Feb-2018" : {
                "lMMAKNLy8jtnnXAN" : {
                    "pin" : "9zDuHcw6qH",
                    "say": "Hello" 
                },
                "e9EV3HDKCceM" : {
                    "pin" : "kPllwcoaob",
                    "say": "Hello" 
                }
            }
        }
    }
}

what I need is to find for all the 'pin' keys, and get their values, to put them into an array. 我需要的是找到所有'pin'键,并获取它们的值,将它们放入一个数组中。

Exactly, I need to have an array like this: 确切地说,我需要一个像这样的数组:

['6K3jP5vLyN', 'hnPKh7ywvT', 'xWwaNNE2XG', 'vMU1mKbZAi', 'qXJCQREATD', 'o5D8S8Lvtb', '9zDuHcw6qH', 'kPllwcoaob']

I have tried: 我努力了:

const array = [];

function iter(obj){
    for(key in obj){
        if(obj.pin)
        array.push(obj.pin);
        if(obj[key]!==null && typeof obj[key]==="object"){
            iter(obj[key]);
        }
    }
}
iter(obj);

But I get the values of each key twice. 但我得到每个键的值两次。 Is there some improved way to do this? 有没有一些改进的方法来做到这一点?

You can use a recursive method to flatten the nested object to it's leaf values. 您可以使用递归方法将嵌套对象展平为其叶值。

Option 1 - the value is the only property on the leaf (original answer before question updated) 选项1 - 值是叶子上的唯一属性(更新问题前的原始答案)

The method extracts the current values to an array using Object.values() . 该方法使用Object.values()将当前值提取到数组。 It iterates the array with Array.map() , and flattens any value which is an object. 它使用Array.map()迭代数组,并展平作为对象的任何值。 The result of each run is spread into Array.concat() to flatten the nested arrays. 每次运行的结果都会传播Array.concat()以展平嵌套数组。

 const data = {"PINS":{"2017":{"Nov-2017":{"VJkRWX7pTSl_5w1Np":{"pin":"6K3jP5vLyN"},"MsdsXiO9G9mwM3Qa":{"pin":"hnPKh7ywvT"}},"Dec-2017":{"Mm35Gjb-nY0k2TV":{"pin":"xWwaNNE2XG"},"WzajCLEJmJHmzg0":{"pin":"vMU1mKbZAi"}}},"2018":{"Jan-2018":{"Wf8E1unVaOh03a43":{"pin":"qXJCQREATD"},"JZqP8fVCLSja6J82v":{"pin":"o5D8S8Lvtb"}},"Feb-2018":{"lMMAKNLy8jtnnXAN":{"pin":"9zDuHcw6qH"},"e9EV3HDKCceM":{"pin":"kPllwcoaob"}}}}}; const flattenObj = (obj) => [].concat(...Object.values(obj).map((o) => typeof o === 'object' ? flattenObj(o) : o)); const result = flattenObj(data); console.log(result); 

Option 2 - the value is not the only property on the leaf 选项2 - 该值不是叶子上的唯一属性

If your data contains other keys, this variant uses Object.entries() to extract a specific key: 如果您的数据包含其他键,则此变体使用Object.entries()来提取特定键:

 const data = {"PINS":{"2017":{"Nov-2017":{"VJkRWX7pTSl_5w1Np":{"pin":"6K3jP5vLyN","say":"Hello"},"MsdsXiO9G9mwM3Qa":{"pin":"hnPKh7ywvT","say":"Hello"}},"Dec-2017":{"Mm35Gjb-nY0k2TV":{"pin":"xWwaNNE2XG","say":"Hello"},"WzajCLEJmJHmzg0":{"pin":"vMU1mKbZAi","say":"Hello"}}},"2018":{"Jan-2018":{"Wf8E1unVaOh03a43":{"pin":"qXJCQREATD","say":"Hello"},"JZqP8fVCLSja6J82v":{"pin":"o5D8S8Lvtb","say":"Hello"}},"Feb-2018":{"lMMAKNLy8jtnnXAN":{"pin":"9zDuHcw6qH","say":"Hello"},"e9EV3HDKCceM":{"pin":"kPllwcoaob","say":"Hello"}}}}}; const flattenObjKey = (obj, key) => [].concat(...Object.entries(obj) .map(([k, v]) => typeof v === 'object' ? flattenObjKey(v, key) : (k === key ? v : []) )); const result = flattenObjKey(data, 'pin'); console.log(result); 

It looks like your data is consistently structured, so this is fairly simple. 看起来您的数据结构一致,所以这很简单。

const pins = [];
for (let year in pins) {
    for (let month in year) {
        for (let key in months) {
            pins.push(key.pin);
        }
    }
}

If it's not consistently structured, you'll need to extract a recursive solution that looks for pin keys. 如果它不是一致的结构,你需要提取一个寻找pin键的递归解决方案。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 通过嵌套对象/数组javascript的特定键搜索 - search by specific key of nested object/array javascript 替换嵌套 object 数组 JavaScript 中某个键的特定值 - Replace specific values for a key in nested object array JavaScript 在深层嵌套 object 中按特定键查找所有值 - Find all values by specific key in a deep nested object 嵌套对象中特定键的函数 - Function on specific key in nested object 检查某些 Javascript 对象键是否具有精确的嵌套值,然后更新特定的嵌套值 - Check if certain Javascript object key has exact nested values and then update specific nested value 在嵌套对象中搜索键和返回值 - Search key and return value in nested object 在 nodejs 的嵌套对象中搜索特定键 - search for a particular key in a nested object in nodejs 递归搜索嵌套的 object 以查找某些键或值 - Recursively search nested object for certain key OR value 通过深度嵌套的对象/数组递归搜索并在不知道键的情况下收集包含指定字符串的值 - Search recursively through a deeply nested object/array and collect values that include a specified string without knowing the key(s) 如何比较嵌套 object / 数组结构中的特定键值? - How does one compare specific key-values within a nested object / array structure?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM