[英]How do I convert an array of objects into an object (dynamically) in JavaScript
我有一个看起来像这样的对象数组:
arr = [
{name: "john", age: 23},
{name: "mary", age: 40},
{name: "zack", age: 17}
]
我试图将它转换成这样的:
{
name: ["john", "mary", "zack"],
age: ['23', 40, 17]
}
我试过以下
arr.map(item => item.name)
arr.map(item => item.age)
return {names, ages}
它工作正常,但这假设您事先已经知道要转换的对象的键。
我希望能够动态加载对象键和相应的值数组。 假设我不知道我们示例数组中的对象有“name”和“age”作为键。
您可以减少对象的数组和条目并收集键组中的值。
const data = [{ name: "john", age: 23 }, { name: "mary", age: 40 }, { name: "zack", age: 17 }], result = data.reduce((r, o) => Object.entries(o).reduce((t, [k, v]) => { if (!t[k]) t[k] = []; t[k].push(v); return t; }, r), {}); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
您可以获取第一个元素的键,然后通过它进行映射。 对于每个,获取其对应的值
const arr = [ { name: "john", age: 23, gender: "male" }, { name: "mary", age: 40, gender: "female" }, { name: "zack", age: 17, gender: "male" }, ] const res = Object.keys(arr[0]).reduce((acc, el) => { const values = arr.map((item) => item[el]) return { ...acc, [el]: values } }, {}) console.log(res)
假设列表中的每个对象都具有相同的键,您可以获得第一个对象的键
const keys = Object.keys(arr[0])
然后使用上述方法映射键
const returnObj = {}
keys.forEach(key => {
returnObj[key] = arr.map(item => item[key])
})
return returnObj
您可以使用Object.entries
进行映射。
var arr = [ {name: "john", age: 23}, {name: "mary", age: 40}, {name: "zack", age: 17} ]; var entries = arr.map((item) => Object.entries(item)); var result = {}; entries.forEach(entry => { entry.forEach(item => { if (result[item[0]] && result[item[0]].length > 0) { result[item[0]].push(item[1]); } else { result[item[0]] = [item[1]]; } }); }); console.log(result);
您可以使用Array.reduce
和Object.keys
。
let arr = [ {name: "john", age: 23}, {name: "mary", age: 40}, {name: "zack", age: 17} ] const formatData = (data) => { return data.reduce((res, obj) => { Object.keys(obj).map(d => { res[d] = [...(res[d] ||[]), obj[d]] }) return res; }, {}) } console.log(formatData(arr))
你可以用 Ramda 做到这一点
import { mergeWith, concat } from “Ramda”
const mergeConcat = mergeWith(concat)
mergeConcat(arr)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.