数组对象转为对象

const arr =  [
  {
    name: 'd',
    value: 'aaa',
  },
  {
    name: 'a',
    value: 'bbb',
  },
  {
    name: 'b',
    value: 'ccc',
  },
  {
    name: 'c',
    value: 'ddd',
  },
]

如何得到:

{
    'aaa': 0, 
    'bbb': 1, 
    'ccc': 2, 
    'ddd': 3, 
}

不用关注键 name,只需保证 value 的顺序。在结果中 value 作为 key,其值对应所在对象在 arr 中的键。

现在这么做:

const map = {}
arr.forEach(({value}, index) => map[value] = index);
console.log(map); // { aaa: 0, bbb: 1, ccc: 2, ddd: 3 }

或者

function invertKeyValues(obj) {
  return Object.keys(obj).reduce((acc, key) => {
    acc[obj[key]] = key;
    return acc;
  }, {});
}

const res = invertKeyValues(
  Object.fromEntries(Object.entries(Array.from(arr, (item) => item.value)))
);

console.log(res); // { aaa: '0', bbb: '1', ccc: '2', ddd: '3' }

请问这样做会很慢吗?有优雅的办法吗?

阅读 2.4k
2 个回答

又来数组转对象?

Object.fromEntries(arr.map(({ name, value }) => [name, value]));

哦,错了,你要的是值和序号,

Object.fromEntries(arr.map(({ value }, i) => [value, i]))

数据量小的话不需要太关注性能,真要计较这点性能,肯定一次遍历是性能最高的,就是你上面forEach的实现方式,或者换成renduce,下面的实现方式转换了好几次代码量还多。

最后,对象无法保证 value 的顺序,因为对象是无序的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题