W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
對(duì)各個(gè)數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)至此告一段落,下面讓我們討論一下如何迭代它們。
在前面的章節(jié)中,我們認(rèn)識(shí)了 map.keys()
,map.values()
和 map.entries()
方法。
這些方法是通用的,有一個(gè)共同的約定來將它們用于各種數(shù)據(jù)結(jié)構(gòu)。如果我們創(chuàng)建一個(gè)我們自己的數(shù)據(jù)結(jié)構(gòu),我們也應(yīng)該實(shí)現(xiàn)這些方法。
它們支持:
Map
?Set
?Array
?普通對(duì)象也支持類似的方法,但是語法上有一些不同。
對(duì)于普通對(duì)象,下列這些方法是可用的:
……但是請(qǐng)注意區(qū)別(比如說跟 map 的區(qū)別):
Map | Object | |
---|---|---|
調(diào)用語法 | map.keys()
|
Object.keys(obj) ,而不是 obj.keys()
|
返回值 | 可迭代對(duì)象 | “真正的”數(shù)組 |
第一個(gè)區(qū)別是,對(duì)于對(duì)象我們使用的調(diào)用語法是 Object.keys(obj)
,而不是 obj.keys()
。
為什么會(huì)這樣?主要原因是靈活性。請(qǐng)記住,在 JavaScript 中,對(duì)象是所有復(fù)雜結(jié)構(gòu)的基礎(chǔ)。因此,我們可能有一個(gè)自己創(chuàng)建的對(duì)象,比如 data
,并實(shí)現(xiàn)了它自己的 data.values()
方法。同時(shí),我們依然可以對(duì)它調(diào)用 Object.values(data)
方法。
第二個(gè)區(qū)別是 Object.*
方法返回的是“真正的”數(shù)組對(duì)象,而不只是一個(gè)可迭代對(duì)象。這主要是歷史原因。
舉個(gè)例子:
let user = {
name: "John",
age: 30
};
Object.keys(user) = ["name", "age"]
?Object.values(user) = ["John", 30]
?Object.entries(user) = [ ["name","John"], ["age",30] ]
?這里有一個(gè)使用 ?Object.values
? 來遍歷屬性值的例子:
let user = {
name: "John",
age: 30
};
// 遍歷所有的值
for (let value of Object.values(user)) {
alert(value); // John, then 30
}
Object.keys/values/entries 會(huì)忽略 symbol 屬性
就像
for..in
循環(huán)一樣,這些方法會(huì)忽略使用Symbol(...)
作為鍵的屬性。
通常這很方便。但是,如果我們也想要 Symbol 類型的鍵,那么這兒有一個(gè)單獨(dú)的方法 Object.getOwnPropertySymbols,它會(huì)返回一個(gè)只包含 Symbol 類型的鍵的數(shù)組。另外,還有一種方法 Reflect.ownKeys(obj),它會(huì)返回 所有 鍵。
對(duì)象缺少數(shù)組存在的許多方法,例如 map
和 filter
等。
如果我們想應(yīng)用它們,那么我們可以使用 Object.entries
,然后使用 Object.fromEntries
:
Object.entries(obj)
? 從 ?obj
? 獲取由鍵/值對(duì)組成的數(shù)組。map
?,對(duì)這些鍵/值對(duì)進(jìn)行轉(zhuǎn)換。Object.fromEntries(array)
? 方法,將結(jié)果轉(zhuǎn)回成對(duì)象。例如,我們有一個(gè)帶有價(jià)格的對(duì)象,并想將它們加倍:
let prices = {
banana: 1,
orange: 2,
meat: 4,
};
let doublePrices = Object.fromEntries(
// 將價(jià)格轉(zhuǎn)換為數(shù)組,將每個(gè)鍵/值對(duì)映射為另一對(duì)
// 然后通過 fromEntries 再將結(jié)果轉(zhuǎn)換為對(duì)象
Object.entries(prices).map(entry => [entry[0], entry[1] * 2])
);
alert(doublePrices.meat); // 8
乍一看,可能感覺有點(diǎn)困難,但是使用一兩次之后就很容易理解了。我們可以通過這種方式建立強(qiáng)大的轉(zhuǎn)換鏈。
重要程度: 5
有一個(gè)帶有任意數(shù)量薪水的 salaries
對(duì)象。
編寫函數(shù) sumSalaries(salaries)
,該函數(shù)使用 Object.values
和 for..of
循環(huán)返回所有薪水的總和。
如果 salaries
是空對(duì)象,那么結(jié)果必須是 0
。
舉個(gè)例子:
let salaries = {
"John": 100,
"Pete": 300,
"Mary": 250
};
alert( sumSalaries(salaries) ); // 650
function sumSalaries(salaries) {
let sum = 0;
for (let salary of Object.values(salaries)) {
sum += salary;
}
return sum; // 650
}
let salaries = {
"John": 100,
"Pete": 300,
"Mary": 250
};
alert( sumSalaries(salaries) ); // 650
還有另外一種可選方案,即使用 Object.values
和 reduce
來求和:
// 使用 reduce 方法遍歷 salaries 數(shù)組
// 把它們加起來
// 返回最終結(jié)果
function sumSalaries(salaries) {
return Object.values(salaries).reduce((a, b) => a + b, 0) // 650
}
重要程度: 5
寫一個(gè)函數(shù) ?count(obj)
?,該函數(shù)返回對(duì)象中的屬性的數(shù)量:
let user = {
name: 'John',
age: 30
};
alert( count(user) ); // 2
試著使代碼盡可能簡(jiǎn)短。
P.S. 忽略 Symbol 類型屬性,只計(jì)算“常規(guī)”屬性。
function count(obj) {
return Object.keys(obj).length;
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: