前言
entries()和keys()、values()一样都是相对通用的一类方法,都存在一个共同的约定来将它们用于各种数据结构如Array、Map和Set,与此同时,普通对象也支持类似的方法。言归正传,本文主要详举了entries()的一些常用方法
正文
Object.entries()
Object.entries()方法用于枚举指定对象并返回给定对象自身可枚举Property的键值对数组,其排列与使用for-in循环遍历该对象时返回的顺序一致,只不过Object.entries()不会枚举原型链中的属性
const a = {foo: 1, bar: 2};
console.log(Object.entries(a));
// [ [ 'foo', 1 ], [ 'bar', 2 ] ]
console.log(Object.entries('baz'));
// [ [ '0', 'b' ], [ '1', 'a' ], [ '2', 'z' ] ]
const obj = {a: 3, b: 4, c: 5};
for(const [key, value] of Object.entries(obj)) {
console.log(key, value);
}
// a 3
// b 4
// c 5
Object.entries(obj).forEach(([key, value]) => {
console.log(key, value);
});
// a 3
// b 4
// c 5
Array.prototype.entries()
Array.prototype.entries()方法返回一个新的Array Iterator对象,该对象包含数组中每个索引的键值对
let arr = ['a', {}, [], 99];
console.log(arr.entries());
// Object [Array Iterator] {}
for (const [key, value] of arr.entries()) {
console.log(key, value);
}
// 0 a
// 1 {}
// 2 []
// 3 99
Map.prototype.entries()
map。prototype.entries()返回一个新的包含[key, value]对的Interable对象,返回迭代器的迭代顺序与Map对象的插入顺序相同
const m = new Map([['k1', 'v1'], ['k2', 'v2'], ['k3', 'v3']]);
console.log(m.entries === m[Symbol.iterator]);
// true
// 映射实例提供的迭代器可以通过entries()方法取得
// Symbol iterator属性也会引用entries(),所以才出现上述结果
for (let e of m.entries()) {
console.log(e);
}
// [ 'k1', 'v1' ]
// [ 'k2', 'v2' ]
// [ 'k3', 'v3' ]
// 因为entries()是默认迭代器,所以可以直接对映射实例使用扩展操作,把映射转换为数组
console.log([...m]);
// [ [ 'k1', 'v1' ], [ 'k2', 'v2' ], [ 'k3', 'v3' ] ]
Set.prototype.entries()
集合的Set.prototype.entries()方法返回一个迭代器,可以按照插入顺序产生包含两个元素的数组,这两个元素是集合中每个值的重复出现
const n = new Set(['a', 'b', 'c']);
for(let pair of n.entries()) {
console.log(pair);
}
// [ 'a', 'a' ]
// [ 'b', 'b' ]
// [ 'c', 'c' ]
// 集合Set的默认迭代器可不是entries(),而是values()
console.log(n[Symbol.iterator] === n.entries);
// false
console.log(n[Symbol.iterator] === n.values);
// true
参考资料
《JavaScript高级程序设计》(第四版)
JavaScript Guidebook
后话
- 今天又是水贴的一天,欧耶
- 遗传学虽然简单但是完全听不进去,还是代码看着舒服,真希望可以不用去教室,大学还是应该给咱更多的自由,嘤嘤
- 不是我不想去教室,实在是我一进教室就想睡觉,一回宿舍就精神百倍,淦