繁体   English   中英

如何在 JavaScript 中(动态地)将对象数组转换为对象

[英]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.reduceObject.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.

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