【问题标题】:Array having multiple inner objects,extract an deeper inner objects as an array具有多个内部对象的数组,将更深的内部对象提取为数组
【发布时间】:2019-07-31 13:54:32
【问题描述】:

我有什么

{
     "1zkhj45kjb3h3jj27777fjd": {"-L7hgtdyYUYY56":{ email: "abc@gmail.com",name:"abc"   } },
     "1zkhj45kjb3h898fj7fjddk": {"-L7hgtdyYUYY56":{ email: "dumy@gmail.com",name:"dumy" } } 
}

我做了什么

const snapshot = snap.val()
const items = Object.values(snapshot)

现在items 看起来像

[
    {"-L7hgtdyYUYY56":{ email: "abc@gmail.com",name:"abc"   } },
    {"-L7hgtdyYUYY56":{ email: "dumy@gmail.com",name:"dumy" } } 
]

但我想要

[
    { email: "abc@gmail.com",name:"abc"   } ,
    { email: "dumy@gmail.com",name:"dumy" } 
]

我已经尝试过所有其他策略,例如Object.keysObject.enteries。 如果我再次调用object.values,它会给出相同的结果。

如何做到这一点 javascript ? 我是反应原生和 javascript 的新手。

谢谢!

【问题讨论】:

    标签: javascript arrays react-native javascript-objects


    【解决方案1】:

    使用Array.flatMap()Object.values() 来获取内部对象的数组:

    const items = {
         "1zkhj45kjb3h3jj27777fjd": {"-L7hgtdyYUYY56":{ email: "abc@gmail.com",name:"abc"   } },
         "1zkhj45kjb3h898fj7fjddk": {"-L7hgtdyYUYY56":{ email: "dumy@gmail.com",name:"dumy" } } 
    }
    
    const result = Object.values(items).flatMap(Object.values)
      
    console.log(result)

    如果不支持Array.flatMap(),请改用Array.map()。但是,结果将是一个数组数组,因此您需要将其展平。您可以通过将数组数组展开到Array.concat() 中来将其展平:

    const items = {
         "1zkhj45kjb3h3jj27777fjd": {"-L7hgtdyYUYY56":{ email: "abc@gmail.com",name:"abc"   } },
         "1zkhj45kjb3h898fj7fjddk": {"-L7hgtdyYUYY56":{ email: "dumy@gmail.com",name:"dumy" } } 
    }
    
    const result = [].concat(...Object.values(items).map(Object.values))
      
    console.log(result)

    【讨论】:

    • 很好的答案@Ori Drori,但请你告诉我为什么这会在本机反应中出错(未污染不是函数)
    • React Native 不支持开箱即用,您需要使用shim
    • 我添加了另一个解决方案,使用 Array.concat() 将数组展平。
    • 伟人,非常感谢您拯救了我的一天@Ori Drori,请您对此进行解释。下次对我很有帮助
    • 酷,我会及时得到它谢谢你的解释,祝你好运
    【解决方案2】:

    Object.values()map()flat() 一起使用两次:

    const data = {
     "1zkhj45kjb3h3jj27777fjd": {"-L7hgtdyYUYY56":{ email: "abc@gmail.com",name:"abc"   } },
     "1zkhj45kjb3h898fj7fjddk": {"-L7hgtdyYUYY56":{ email: "dumy@gmail.com",name:"dumy" } } 
    };
    
    const result = Object.values(data).map(Object.values).flat();
    
    console.log(result);

    【讨论】:

    • 感谢您的回答,不幸的是它在本机反应中不起作用
    【解决方案3】:

    使用Object.values()获取嵌套对象作为数组,然后使用.map()获取每个对象-L7hgtdyYUYY56的值。

    const snapshot = {
     "1zkhj45kjb3h3jj27777fjd": {"-L7hgtdyYUYY56":{ email: "abc@gmail.com",name:"abc"   } },
     "1zkhj45kjb3h898fj7fjddk": {"-L7hgtdyYUYY56":{ email: "dumy@gmail.com",name:"dumy" } } 
    };
    
    var result = Object.values(snapshot).map(e => e["-L7hgtdyYUYY56"]);
    console.log(result);

    这假设嵌套对象只有一个属性,并且它们都是相同的属性名称,如您的示例所示。如果它更具动态性,则使对象变平的其他答案更合适。

    【讨论】:

    • @Bammer 感谢您的回答,但如果我每次都不知道 -L7hgtdyYUYY56 这个值怎么办。所有答案 sn-ps 都可以正常工作,但在 react native 中它不起作用
    • 如果您不知道属性名称,请使用其他答案。
    猜你喜欢
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    相关资源
    最近更新 更多