Symbol.iterator: 获取迭代器对象中所有对象的属性
Symbol.iterator: get all the object's properties in iterator object
我目前正在阅读有关 Symbols and Iterators(ES6 功能)的信息,在 运行 进入那里的示例之后,我正在尝试使对象可迭代,以便我可以使用 for...of
功能.从几个 examples/answers here/articles 我查了一下,在普通情况下看起来像这样:
let obj = {
prop1: 5,
prop2: 'test',
prop3: new Date(),
[Symbol.iterator]: () => ({
items: obj.items,
next: function next() {
return {
done: this.items.length === 0,
value: this.items.shift()
}
}
})
};
Object.defineProperty(obj, "items", {
enumerable: false,
get: function() {
let props = [];
for(let prop in this) if(this.hasOwnProperty(prop)) props.push(this[prop]);
return props;
}
});
for(let prop of obj) console.log(prop);
但是我发现在 items
迭代器数组中手动列出对象属性的所有值很烦人。而且 Object.defineProperty
感觉又脏又乱。我有点想扩展 link 中的示例。有没有一种 smarter/simpler 方法可以在迭代器中获取所有对象的属性(而不是 items: obj.items
和相关的膨胀或手动列出项目,如 items: [5, 'test', new Date()]
)?
您不应使用 items
getter,而应在迭代器方法中创建数组。您也可以使用生成器语法来创建迭代器,这更容易。
但是实现你想要的最简单的方法是
let obj = {
prop1: 5,
prop2: 'test',
prop3: new Date(),
[Symbol.iterator]() { return Object.keys(this).map(k => this[k])[Symbol.iterator](); }
};
您可以 return 符号迭代器中的生成器也许:
[Symbol.iterator]:function*(){
for(value of Object.values(this)){
yield value;//may extend this to your needs
}
}
或者您的情况:
[Symbol.iterator]:function*(){
var i=1;
while(this["prop"+i]){
yield this["prop"+i];//may extend this to your needs
i++;
}
}
function objectEntries(obj) {
let index = 0;
// In ES6, you can use strings or symbols as property keys,
// Reflect.ownKeys() retrieves both
let propKeys = Reflect.ownKeys(obj);
return {
[Symbol.iterator]() {
return this;
},
next() {
if (index < propKeys.length) {
let key = propKeys[index];
index++;
return { value: [key, obj[key]] };
} else {
return { done: true };
}
}
};
}
let obj = { first: 'Jane', last: 'Doe' };
for (let [key,value] of objectEntries(obj)) {
console.log(`${key}: ${value}`);
}
我目前正在阅读有关 Symbols and Iterators(ES6 功能)的信息,在 运行 进入那里的示例之后,我正在尝试使对象可迭代,以便我可以使用 for...of
功能.从几个 examples/answers here/articles 我查了一下,在普通情况下看起来像这样:
let obj = {
prop1: 5,
prop2: 'test',
prop3: new Date(),
[Symbol.iterator]: () => ({
items: obj.items,
next: function next() {
return {
done: this.items.length === 0,
value: this.items.shift()
}
}
})
};
Object.defineProperty(obj, "items", {
enumerable: false,
get: function() {
let props = [];
for(let prop in this) if(this.hasOwnProperty(prop)) props.push(this[prop]);
return props;
}
});
for(let prop of obj) console.log(prop);
但是我发现在 items
迭代器数组中手动列出对象属性的所有值很烦人。而且 Object.defineProperty
感觉又脏又乱。我有点想扩展 link 中的示例。有没有一种 smarter/simpler 方法可以在迭代器中获取所有对象的属性(而不是 items: obj.items
和相关的膨胀或手动列出项目,如 items: [5, 'test', new Date()]
)?
您不应使用 items
getter,而应在迭代器方法中创建数组。您也可以使用生成器语法来创建迭代器,这更容易。
但是实现你想要的最简单的方法是
let obj = {
prop1: 5,
prop2: 'test',
prop3: new Date(),
[Symbol.iterator]() { return Object.keys(this).map(k => this[k])[Symbol.iterator](); }
};
您可以 return 符号迭代器中的生成器也许:
[Symbol.iterator]:function*(){
for(value of Object.values(this)){
yield value;//may extend this to your needs
}
}
或者您的情况:
[Symbol.iterator]:function*(){
var i=1;
while(this["prop"+i]){
yield this["prop"+i];//may extend this to your needs
i++;
}
}
function objectEntries(obj) {
let index = 0;
// In ES6, you can use strings or symbols as property keys,
// Reflect.ownKeys() retrieves both
let propKeys = Reflect.ownKeys(obj);
return {
[Symbol.iterator]() {
return this;
},
next() {
if (index < propKeys.length) {
let key = propKeys[index];
index++;
return { value: [key, obj[key]] };
} else {
return { done: true };
}
}
};
}
let obj = { first: 'Jane', last: 'Doe' };
for (let [key,value] of objectEntries(obj)) {
console.log(`${key}: ${value}`);
}