如何将对象数组转换为键值对对象

35

我想在JavaScript中将对象数组转换为键值对对象。

var arr=[{"name1":"value1"},{"name2":"value2"},...}];

我该如何将它转换为对象,例如

{"name1":"value1","name2":"value2",...}

我希望它能在大多数浏览器中得到支持。

7个回答

76
你可以使用Object.assign和展开语法...来创建一个包含给定对象数组的单个对象。

var array = [{ name1: "value1" }, { name2: "value2" }],
    object = Object.assign({}, ...array);
    
console.log(object);


即使现在有对象展开符可用,Object.assign 仍有一些好的用途,这就是其中之一。 - Estus Flask

7
你可以在数组上运行reduce并返回一个新对象。但是需要记住的重要一点是,如果属性相同,它们将被覆盖。
const newObject = array.reduce((current, next) => {
  return { ...current, ...next};
}, {})

如果你使用的是ES5而不是ES6:

var newObject = array.reduce(function(current, next){
  return Object.assign({}, current, next);
}, {})

这非常低效(二次时间,大量中间对象),可以通过使用Object.assign(current, next)而不是Object.assign({}, current, next)来解决。 - Ry-

5

使用现代JS(个人见解):

  1. 将每个对象分割成条目
  2. 将所有条目聚合成一个对象

const arr = [{name1:"value1"}, {name2:"value2"}, {a:1,b:2}];
const obj = Object.fromEntries(arr.flatMap(Object.entries));
console.log(obj);


Object.fromEntries和Array::flatMap都很慢。 - undefined

3
尝试这个简单的逻辑。

var arr=[{"name1":"value1"},{"name2":"value2"}];
var obj = {}; //create the empty output object
arr.forEach( function(item){ 
   var key = Object.keys(item)[0]; //take the first key from every object in the array
   obj[ key ] = item [ key ];  //assign the key and value to output obj
});
console.log( obj );


对于短数组和 ES5 环境来说,这似乎是最易读/简单的方式。 - Andy B

3

Array#forEachObject.keys一起使用

var arr = [{"name1": "value1"},{"name2": "value2"}];
var obj = {};
arr.map(k => Object.keys(k).forEach(a => obj[a] = k[a]))
console.log(obj)


1
一个 map 方法会返回一个新的数组,但是这个函数只是用来改变 var obj,所以使用 forEach 更加合适。 - Benji Lees
Object.keys(k).forEach(a => obj[a] = k[a])Object.assign(obj, k) 的一个更慢、不易读和不兼容的版本。 - Ry-

-1

使用 for...in 循环 :

var arr=[{"name1":"value1"},{"name2":"value2"}];

var obj = {};
for (var i in arr) {
  obj[Object.keys(arr[i])] = arr[i][Object.keys(arr[i])];
}

console.log(obj);

使用 ES6Array.map() 方法:

var arr=[{"name1":"value1"},{"name2":"value2"}];

var obj = {};

arr.map(item => obj[Object.keys(item)] = item[Object.keys(item)]);

console.log(obj);

使用ES6spreaqd(...)赋值和Object.assign()方法:

let arr=[{"name1":"value1"},{"name2":"value2"}];

let obj = Object.assign({}, ...arr);

console.log(obj);


-1
假设您有myObjectmyArray
myObject = {};
myArray = [
    {itemOneKey: 'itemOneValue', itemTwoKey: 'itemTwoValue'},
    {itemThreeKey: 'itemThreeValue'}
];

只需尝试这个:

myArray.map(obj => {
  Object.keys(obj).map(key => myObject[key] = obj[key])
});

const myObject = {};
const myArray = [
    {itemOneKey: 'itemOneValue', itemTwoKey: 'itemTwoValue'},
    {itemThreeKey: 'itemThreeValue'}
];

myArray.map(obj => {
  Object.keys(obj).map(key => myObject[key] = obj[key])
});

console.log(myObject);


Object.keys(obj).map(key => myObject[key] = obj[key]) 是一种速度较慢、可读性较差、兼容性较低的代码,Object.assign(myObject, obj) 是更好的选择。 - Ry-
谁告诉你的?在规范中哪里说了,给我看看。 - underflow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接