👩 个人主页:不爱吃糖的程序媛
🙋‍♂️ 作者简介:前端领域新星创作者、CSDN内容合伙人,专注于前端各领域技术,成长的路上共同学习共同进步,一起加油呀!
✨系列专栏:前端面试宝典、JavaScript进阶、vue实战
📢 资料领取:前端进阶资料以及文中源码可以在🎈公众号“不爱吃糖的程序媛”领取💖

首先,我们要明白对象具有键和值。

JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。

如果我们想把某个东西转换成一个对象,我们需要传递具有这两个要求的东西:键和值。
满足这些要求的参数有两种类型:

  • 具有嵌套键值对的数组
  • Map 对象

将数组转为对象

1.Object.fromEntries方法

const newArray = [
  ['key 1', 'value 1'],
  ['key 2', 'value 2']
]
Object.fromEntries(newArray) // { key 1: "value 1", key 2: "value 2"}

2.Map方法

ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。

也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。

const map = new Map([
  ['key 1', 'value 1'],
  ['key 2', 'value 2']
])
// 或者我们可以使用实例方法 set
const map = new Map()
map.set('key 1', 'value 1')
map.set('key 2', 'value 2')
Object.fromEntries(map) // { key 1: "value 1", key 2: "value 2"}

3.Reduce方法

const array = [
  ['key1', 'value1'],
  ['key2', 'value2']
]
//或者
const map = new Map([
  ['key1', 'value1'],
  ['key2', 'value2']
])
//这个方法好用!
function toObject(pairs) {
  return Array.from(pairs).reduce(
    (acc, [key, value]) => Object.assign(acc, { [key]: value }),
    {}
  )
}
toObject(array) // { key1: 'value1', key2: 'value2' }
toObject(map) // { key1: 'value1', key2: 'value2' }

4.Underscore 和 Lodash工具集合框架

Lodash是一个具有一致接口、模块化、高性能的JavaScript工具库。一开始Lodash只是Underscore.js的一个fork,之后再原有的成功基础上取得了更大的成果,lodash的性能远远的超过了Underscore。
官网文档:https://www.lodashjs.com/

Underscore 和 Lodash 也可将键值对转换为对象。
_.object — 将阵列转换为对象。传递单个[键、值]对列表,或键列表和值列表。

// Underscore
const array = [
  ['key1', 'value1'],
  ['key2', 'value2']
]
_.object(array) // { key1: 'value1', key2: 'value2' }

_.fromPairs — 此方法返回由键值对组成的对象。

// Lodash
const array = [
  ['key1', 'value1'],
  ['key2', 'value2']
]
_.fromPairs(array) // { key1: 'value1', key2: 'value2' }

将对象转为数组

1. Object.entries方法

Object.entries 方法返回一个给定对象自身可枚举属性的键值对数组。

const object = { key1: 'value1', key2: 'value2' }
const array = Object.entries(object) // [ ["key1", "value1"], ["key2", "value2"] ]
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。