繁体   English   中英

如何将单个对象对象转换为对象数组?

[英]How can I convert a single Object of objects, into an array of objects?

我正在从Firebase数据库中检索书籍列表,其中每个“书籍”都是一个对象。

书籍的有效负载是这样的一个整体对象:

{ 
      key1: { 
       "title": "A Good Book"
       "author": "A Person"
      },
      key2: {
       "title": "Another Good Book"
       "author": "Another person"
      }
     ...and so on
    }

我需要将该整体对象更改为对象数组,以便可以映射每个对象并提取所需的值。

我需要的预期数组:

    [
       { 
         "title": "A Good Book"
         "author": "A Person"
       },
       {
         "title": "Another Good Book"
         "author": "Another person"
       }
    ]

我试过使用Object.entries(myObject)Object.values(myObject)但这只会返回有关对象的乱码。

我已经尝试过其他来自堆栈溢出的答案,例如:

    var array = Object.entries(data).map(([phrase, date]) => ({phrase,date}));

但这是行不通的。

我最初以为这应该是直接且常见的问题,但是在经过堆栈溢出和google几天后,我没有遇到类似的问题和解决方案。

像这样的任何对象中都必须有一些键(我对其进行了编辑):

    let data = { 
       { 
      "Harry Potter": {
          "BookInfo": { 
               "Pages": 500,
               "Author": "JK Rowling"
           },
          "SaleInfo": "For Sale"
      },
     "A Clockwork Orange": {
           "BookInfo": { 
               "Pages": 200,
               "Author": "Anthony Burgess"
           },
          "SaleInfo": "For Sale"
      }
    }
     ...and so on
    }

如果是这样,则可以将Object.valus()用作:

const books =  { 
      "Harry Potter": {
          "BookInfo": { 
               "Pages": 500,
               "Author": "JK Rowling"
           },
          "SaleInfo": "For Sale"
      },
     "A Clockwork Orange": {
           "BookInfo": { 
               "Pages": 200,
               "Author": "Anthony Burgess"
           },
          "SaleInfo": "For Sale"
      }
     ...
    }
const booksMapped = Object.keys(books).map(bookName => {
  return {
    bookName,
    ...books[bookName]
  }
})

console.log(booksMapped)
/*
[
  {
    "bookName": "Harry Potter",
    "BookInfo": {
      "Pages": 500,
      "Author": "JK Rowling"
    },
    "SaleInfo": "For Sale"
  },
  {
    "bookName": "A Clockwork Orange",
    "BookInfo": {
      "Pages": 200,
      "Author": "Anthony Burgess"
    },
    "SaleInfo": "For Sale"
  }
]
*/

基本上Object.keys()会给您一个数组,其中包含每个给定对象的键,然后您可以在其上链接任何数组方法,例如: map reduce forEach filter find

let person {
  name: "John Doe",
  age: 18
}

Object.keys(person) // => ["name", "age"]
Object.values(person) // => ["John Doe", 18]

您可以map对象的entries以获取对象数组:

 const input = { "Harry Potter": { BookInfo: { Pages: 500, Author: "JK Rowling" }, SaleInfo: "For Sale", }, "A Clockwork Orange": { BookInfo: { Pages: 200, Author: "Anthony Burgess" }, SaleInfo: "For Sale", } }; const output = Object.entries(input).map(([title, value ]) => ({ title, author: value.BookInfo.Author })) console.log(output) 

最优雅的解决方案是使用flatMap():

const sorce = { 
      key1: { 
       "title": "A Good Book",
       "author": "A Person"
      },
      key2: {
       "title": "Another Good Book",
       "author": "Another person"
      }
    };

const result = Object.keys(sorce).flatMap(key => sorce[key]);
console.log(result);

结果:[{标题:“一本好书”,作者:“一个人”},
{标题:“另一本好书”,作者:“另一人”}]

PS在这种情况下,我们可以使用map来获得相同的结果:

const result = Object.keys(sorce).map(key => sorce[key]);

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM