![](/img/trans.png)
[英]How can I convert an array of objects into single object while keys of all the objects are same and value may differ
[英]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]
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.