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

时间:2020-04-18 22:16:05

标签: javascript arrays ecmascript-6 key-value topological-sort

这可能是2班轮,但由于某种原因我碰到了墙。

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

所以:

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

对此:

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

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

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

我想最好使用ES6箭头功能。另外,有人可以告诉我您是否认为以第一种或第二种格式操作此数据会更容易? 对于上下文,我正在尝试自学拓扑排序。

5 个答案:

答案 0 :(得分:5)

一种更简洁的方法是使用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);

答案 1 :(得分:3)

我会用Array.prototype.reduce()来做到这一点,它比Object.fromEntries()更加简洁,当然faster

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%;}

答案 2 :(得分: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);

答案 3 :(得分: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: Difference between .forEach() and .map()

答案 4 :(得分:0)

使用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);