首先,我們需要明白對象具有鍵和值。
const object = {
key: 'value'
}
如果我們想把某個東西轉(zhuǎn)換成一個對象,我們需要傳遞具有這兩個要求的東西:鍵和值。
滿足這些要求的參數(shù)有兩種類型:
- 具有嵌套鍵值對的數(shù)組
-
Map
對象
數(shù)組
這是一個帶有鍵值對的嵌套數(shù)組
const nestedArray = [
['key 1', 'value 1'],
['key 2', 'value 2']
]
當(dāng)我們應(yīng)用它時,我們可以使用 Object.fromEntries
方法獲取對象:
Object.fromEntries(nestedArray) // { key 1: "value 1", key 2: "value 2"}
Map
ES6 為我們帶來了一個名為 Map
新的數(shù)據(jù)結(jié)構(gòu),它與 Objects
非常相似。
TC39:
Map
對象是鍵/值對的集合,其中鍵和值可以是任意的 ECMAScript 語言值。
讓我們創(chuàng)建新的 map
對象。
// 使用 constructor
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')
// Map(2) {"key 1" => "value 1", "key 2" => "value 2"}
現(xiàn)在讓我們使用 object.fromEntries
將 map
轉(zhuǎn)換成一個對象
Object.fromEntries(map) // { key 1: "value 1", key 2: "value 2"}
其他類型
嘗試將其他數(shù)據(jù)類型傳遞到 Object.fromEntries
時要小心。以下所以列出的所有情況將一致拋出一個錯誤:
類型 | |
---|---|
undefined |
Object.fromEntries(undefined) |
Null |
Object.fromEntries(null) |
Boolean |
Object.fromEntries(true) |
Number |
Object.fromEntries(100) |
String |
Object.fromEntries("hi") |
Object |
Object.fromEntries({key: "value"}) |
扁平化數(shù)組 | Object.fromEntries([1,2,3]) |
注意:確保只傳遞一個鍵值對。
Object.fromEntries 和 Object.entries
Object.entries
方法返回一個給定對象自身可枚舉屬性的鍵值對數(shù)組。
const object = { key1: 'value1', key2: 'value2' }
const array = Object.entries(object) // [ ["key1", "value1"], ["key2", "value2"] ]
Object.fromEntries(array) // { key1: 'value1', key2: 'value2' }
對象到對象轉(zhuǎn)換
你可以在最初的 TC39 提案 找到引入 Object.entries
方法的緣由。
通常,當(dāng)我們選擇使用 Object.entries
時,是因為它讓我們能夠訪問一些漂亮的數(shù)組方法。
const user = {
name: 'O.O',
age: 18,
address: 'xxx'
}
console.log(Object.entries(user).filter(([key, value]) => key !== 'age'))
// [["name", "O.O"], ["address", "xxx"]]
它返回了一組嵌套數(shù)組,而不是我們想要的對象轉(zhuǎn)對象,后面又引入了 fromEntries
方便該操作。
const arr = [["name", "O.O"], ["address", "xxx"]]
console.log((Object.fromEntries(arr)) // {name: "O.O", address: "xxx"}
const user = {
name: 'O.O',
age: 18,
address: 'xxx'
}
Object.fromEntries(Object.entries(user).filter(([key, value]) => key !== 'age'))
// {name: "O.O", address: "xxx"}
瀏覽器支持情況
除了 IE,大多數(shù)主流瀏覽器都支持這種方法:

替代方案
Object.fromEntries
于2019年推出,所以它仍然是相當(dāng)新的的一個方法。因此,在照顧舊瀏覽器的情況下,我們需要其他的替代方案,將一個鍵值對數(shù)組轉(zhuǎn)化為一個對象以更好的支持。
Reduce
將數(shù)組轉(zhuǎn)換為對象的一種常用方法是使用 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' }
Underscore 和 Lodash
Underscore 和 Lodash 也可將鍵值對轉(zhuǎn)換為對象。
_.object
— 將陣列轉(zhuǎn)換為對象。傳遞單個[鍵、值]對列表,或鍵列表和值列表。文章來源:http://www.zghlxwxcb.cn/news/detail-430203.html
// Underscore
const array = [
['key1', 'value1'],
['key2', 'value2']
]
_.object(array) // { key1: 'value1', key2: 'value2' }
_.fromPairs
— 此方法返回由鍵值對組成的對象。文章來源地址http://www.zghlxwxcb.cn/news/detail-430203.html
// Lodash
const array = [
['key1', 'value1'],
['key2', 'value2']
]
_.fromPairs(array) // { key1: 'value1', key2: 'value2' }