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

7
这可能只是两行代码的问题,但由于某些原因我卡住了。
我想把一个对象数组转换成一个键值对对象。
例如:
var items = [
    {
      name: 'hello',
      value: ['one', 'two']
    },
    {
      name: 'hi',
      value: ['one', 'two', 'three']
    }
]

to this:

var items = {
    'hello': ['one', 'two'],
    'hi': ['one', 'two', 'three']
}

这真的是最优雅的方式吗?

const newObj = {};
items.forEach((item) => {
  newObj[item.name] = item.value;
});

我希望尽量使用ES6箭头函数。另外,有人能告诉我你认为在第一种格式还是第二种格式中更容易操作这些数据吗? 为了背景,我正在尝试自学拓扑排序。

2
一个更优雅的方式是 Object.fromEntries(items.map(({ name, value }) => [name, value])) ... 但如果这更优雅,我不知道。 - Jonas Wilms
1
这个回答解决了你的问题吗?如何在JavaScript中将对象数组转换为一个对象? - Ivar
5个回答

7

我会使用Array.prototype.reduce()来完成这个任务,它比Object.fromEntries()更加简洁,而且速度更快:

const items = [{name:'hello',value:['one','two']},{name:'hi',value:['one','two','three']}], 

result = items.reduce((r,{name,value}) => (r[name]=value,r), {})

console.log(result)
.as-console-wrapper{min-height:100%;}


6
更为简洁的方法是使用 Object.fromEntries:

var items = [
    {
      name: 'hello',
      value: ['one', 'two']
    },
    {
      name: 'hi',
      value: ['one', 'two', 'three']
    }
];
const newObj = Object.fromEntries(
  items.map(({ name, value }) => [name, value])
);
console.log(newObj);


@bspckl:如果你计划处理一些大型数据集并且需要确保性能,那么周围甚至有更简洁和快速的选项;) - Yevhen Horbunkov

1
使用 Object.valuesObject.fromEntries 来简化为一行。
Object.fromEntries(items.map(item => Object.values(item)))

var items = [
  {
    name: "hello",
    value: ["one", "two"]
  },
  {
    name: "hi",
    value: ["one", "two", "three"]
  }
];

const res = Object.fromEntries(items.map(item => Object.values(item)));

console.log(res);


如果你的目标是极致简洁,你可以使用 Object.fromEntries(items.map(Object.values)) 或者完全进行代码高尔夫,使用 with(Object)fromEntries(arr.map(values)) - Yevhen Horbunkov

0

我不确定这是否更加优雅,但我认为在这里使用reduce是有意义的。

var items = [
    {
      name: 'hello',
      value: ['one', 'two']
    },
    {
      name: 'hi',
      value: ['one', 'two', 'three']
    }
];


const newObj = items.reduce((c, {value, name}) => {
  c[name] = value;
  return c;
}, {});

console.log(newObj);


0

通过映射每个数组元素:

使用map()方法:

const newObj = {};
items.map( ( { name, value } ) => {
    newObj[name] = value;
});

编辑:

使用 forEach() 方法:

const newObj =
((obj) => {
    items.forEach(({ name, value }) => { obj [name] = value });
    return obj;
 })({});

JavaScript:.forEach()和.map()的区别


这是对 map() 方法的非常规使用,因为它应该返回与输入相同大小的数组,所以考虑到您只是用它进行循环并在旁边执行必要的操作(分配 newObj 属性),您最好使用 Array.prototype.forEach() - Yevhen Horbunkov
真的吗?那么map()方法和forEach()方法有什么不同呢? - OO7

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