遍历对象
此页面需较新浏览器(支持 SharedArrayBuffer)。请升级 Chrome、Edge、Firefox 或 Safari 至最新版本。
访问对象的每个键
- 对象没有
0, 1, 2这样的下标,所以普通的for循环无法逐个访问它。 for (const key in obj)依次给你每个键。- 用方括号读取值:
obj[key]。点号写法obj.key会去找一个名字就叫 "key" 的键。
English
const stock = { apples: 4, pears: 0, plums: 7 };
for (const fruit in stock) {
console.log(fruit, stock[fruit]);
}
// → apples 4
// → pears 0
// → plums 7
把键、值和键值对变成数组
Object.keys(obj)得到由键组成的数组。Object.values(obj)得到由值组成的数组。Object.entries(obj)得到由[key, value]对组成的数组。可以用for…of遍历它。
English
const stock = { apples: 4, pears: 0, plums: 7 };
console.log(Object.keys(stock)); // → ["apples","pears","plums"]
console.log(Object.values(stock).length); // → 3
for (const [fruit, count] of Object.entries(stock)) {
if (count === 0) {
console.log(fruit + " sold out");
}
}
// → pears sold out
例题:总分和最高分
问题:一个对象保存每个学生的分数。求总分,以及分数最高的名字。
const scores = { Ada: 82, Ben: 95, Cy: 77 };
let total = 0;
let best = "";
for (const name in scores) {
total += scores[name];
if (best === "" || scores[name] > scores[best]) {
best = name;
}
}
console.log(total); // → 254
console.log(best); // → Ben
循环保存的是最高分学生的名字,而不只是分数,因为只看分数无法知道它属于谁。
注意
for…in用于对象。对数组要用for…of,它给出的是值。Object.keys(obj).length数出键的个数。对象本身没有.length。
常见错误
- 在循环里写
stock.fruit。它会去找名为fruit的键,得到undefined。应写stock[fruit]。 - 直接对对象用
for…of。它会报错 "stock is not iterable"。应遍历Object.entries(stock)。 - 本该保存名字的
best却从0开始。应从""或第一个键开始。
现在轮到你
- 遍历一个对象的键,再把它的值加起来。
- 按检查答案来测试它。
难度 1/5 · 今日首次完成可获 100 金币及少量额外奖励
const pet = { name: "Rex", age: 3 }。用 for…in 打印每个键和它的值,中间用空格隔开(name Rex,然后 age 3)。
点击“运行”查看此处输出。
难度 2/5 · 今日首次完成可获 140 金币及少量额外奖励
编写 totalItems(cart),把对象(例如 { pens: 3, books: 2 },结果是 5)里的所有值加起来。空对象得 0。
点击“运行”查看此处输出。
难度 3/5 · 今日首次完成可获 200 金币及少量额外奖励
编写 soldOut(stock),按对象中的顺序返回值为 0 的键组成的数组。soldOut({ apples: 4, pears: 0, figs: 0 }) 得到 ["pears", "figs"]。
点击“运行”查看此处输出。