亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

ES6+ Object.entries()

1. 前言

前兩節我們學習了獲取可枚舉對象上屬性和屬性值作為一個數組的方法 Object.keys()Object.values(),但是我們想把鍵值對同時獲取到怎么辦呢?這時 ES6 提供了 Object.entries() 方法用于獲取可枚舉對象上的屬性和值的數組。

2. 方法詳情

Object.entries() 會返回一個二維數組,數組中的每一項是可枚舉對象上的屬性和值的數組。

2.1 語法使用

Object.entries(obj);
參數 描述
obj 可以返回其枚舉自身屬性和鍵的對象

2.2 基本使用

返回結果是一個二維數組,數組中的每個元素是一個包含兩個元素的數組,第一個元素是屬性,第二個元素是屬性對應的值。

var obj = {a: 1, b: 2, c: 3};
console.log(Object.entries(obj))
// [['a', 1], ['b', 3], ['c', 3]]

如果傳入的參數是數字或布爾值時,則返回一個空數組

Object.entries(50)       // []
Object.entries(false)    // []

values() 返回數組的順序,會按照屬性的數值大小,從小到大排序。

var obj = {10: 'a', 1: 'b', 7: 'c'};
console.log(Object.entries(obj))
// [["1", "b"], ["7", "c"], ["10", "a"]]

上面的代碼中,屬性名為數值的屬性,是按照數值大小,從小到大遍歷的,因此返回值是一個排序后的二維數組。

values() 傳入的對象如果是一個字符串時,則會把字符拆成數組中的單個項,如下:

console.log(Object.entries('abc'))
// [["0", "a"], ["1", "b"], ["2", "c"]]

3. 案例

3.1 用于 for…of 循環獲取對象上的鍵值對

Object.entries() 在開發中有很好的用途,可以同時獲取對象的鍵值對進行使用。

其實像使用 Object.keys()、 Object.values()Object.entries() 都是為了遍歷對象,然后對對象中的元素進行操作,下面我們來看一下 Object.entries() 在 for 循環中的使用。

var obj = { name: 'imooc', age: 7, lesson: 'ES6 Wiki' };
for (let i = 0; i < Object.entries(obj).length; i++) {
  var [key, value] = Object.entries(obj)[i]
  console.log(key, value);
}

上面的代碼中我們可以看出,在循環體內可以通過結構的方式獲取對象的屬性和值。使用 for 循環時我們要對循環的每一步進行處理。

在下面的章節中我們會學到 for...of 循環,它的功能強大,能遍歷可迭代的對象,可以替代 forforEach 等循環,并具有擴展性。

let obj = { name: 'imooc', age: 7, lesson: 'ES6 Wiki' };

for (let [key, value] of Object.entries(obj)) {
  console.log(`${key}: ${value}`);
}
// name: imooc
// age: 7,
// lesson: ES6 Wiki

上面的代碼中,我們不用在 for 循環中處理每一項,可以在循環時直接解構出 Object.entries() 的值。這樣就可以遍歷出對象的鍵值對。

3.2 把對象轉為 Map 結構

Object.entries() 還有一個最重要的功能,就是可以把指定的對象直接轉化成 ES6 的 Map 數據結構。

ES6 提供了新的 Map 數據結構,它類似于對象,也是鍵值對的集合,但是 Map 的鍵可以是任意類型(原始類型和對象類型),并且提供了 set 、 get 方法去設置和獲取對象的值。如果想把一個對象轉為 Map 結構,可以借助 Object.entries() 來實現。

var obj = { name: 'imooc', age: 7 };
var map = new Map(Object.entries(obj));
console.log(map)            // Map(2) {"name" => "imooc", "age" => 7}
console.log(map.get(name))  // imooc

上面的代碼中,很好地把已有的對象,轉化為 Map 對象,而且可以使用 Map 的方法獲取對象上的數據。

4. Object.fromEntries()

Object.fromEntries()Object.entries() 的反轉函數,這樣理解起來就比較輕松。它接收的是一個可迭代的對象,類似 Array、Map 或者其它實現了可迭代協議的對象,結果返回一個新的對象。

4.1 數組轉化為對象

將一個帶有鍵值對的數組轉化成對象。

var arr = [ ['a', '0'], ['b', '1'], ['c', '2'] ];
var obj = Object.fromEntries(arr);
console.log(obj); // {a: "0", b: "1", c: "2"}

上面的代碼中,arr 是一個二維數組,子數組中的每一個項包含鍵和值,只有這樣的數組類型才可以轉化為對象。

4.2 Map 轉化為對象

Object.fromEntries() 可以直接將 Map 結構的對象轉化為一個正常的對象,在開發中是一個非常常用的方法。

var map = new Map();
map.set('name', 'imooc');
map.set('age', 7);
console.log(map);     // Map(2) {"name" => "imooc", "age" => 7}
var obj = Object.fromEntries(map);
console.log(obj);     // {name: "imooc", age: 7}

上面的代碼中,先定義一個 Map 數據結構,并給 map 添加 nameage 兩個屬性,然后使用 Object.fromEntries() 方法對 map 進行操作,最后可以得到一個對象。

4. 小結

本節主要講解了 ES6 提供了獲取可枚舉對象上的鍵值對的方法,這個方法在開發中很常用,主要用于 for...of 循環和 Map 數據結構的轉化。另外,Object.fromEntries()Object.entries() 的反轉函數,他們的操作是相反的,主要用在對 Map 數據結構轉換為普通的對象結構。