【问题标题】:Convert array of objects to object of key-value pairs将对象数组转换为键值对对象
【发布时间】:2020-04-18 22:16:05
【问题描述】:

这可能是 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 箭头函数。另外,有人可以告诉我您是否认为以第一种格式或第二种格式操作这些数据更容易? 对于上下文,我正在尝试自学拓扑排序。

【问题讨论】:

  • 也可以使用Object.fromEntries(items.map(({ name, value }) => [name, value])) ...但如果这样更优雅,我不知道。

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


【解决方案1】:

我会用Array.prototype.reduce() 做到这一点,它更简洁,当然fasterObject.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%;}

【讨论】:

    【解决方案2】:

    更简洁的方法是使用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 : 如果您打算处理一些大型数据集并且需要一定的性能,还有更简洁的fast 选项;)跨度>
    【解决方案3】:

    我不知道这是否更优雅,但我认为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);

    【讨论】:

      【解决方案4】:

      使用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))
      【解决方案5】:

      只需映射每个数组元素:

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

      【讨论】:

      • map() 方法的使用有点不合常规,因为它预计返回与输入相同大小的数组,因此,考虑到您只需将其用于循环并执行必要的操作(分配 @987654325 @properties)旁边,你会更好Array.prototype.forEach()
      • 真的吗?那么 map() 方法和 forEach() 方法有什么区别呢?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      • 2019-09-13
      • 2022-01-18
      • 1970-01-01
      相关资源
      最近更新 更多