Учитывая ES6, я бы хотел добавить собственную ложку сахара и предоставить еще один подход для перебора свойств объекта.
Поскольку простой объект JS не является повторяемым просто из коробки, мы не можем использовать цикл for..of
для перебора его содержимого. Но никто не может остановить нас , чтобы сделать его итеративным .
Давайте получим book
объект.
let book = {
title: "Amazing book",
author: "Me",
pages: 3
}
book[Symbol.iterator] = function(){
let properties = Object.keys(this); // returns an array with property names
let counter = 0;
let isDone = false;
let next = () => {
if(counter >= properties.length){
isDone = true;
}
return { done: isDone, value: this[properties[counter++]] }
}
return { next };
}
Поскольку мы сделали это, мы можем использовать его следующим образом:
for(let pValue of book){
console.log(pValue);
}
------------------------
Amazing book
Me
3
Или, если вы знаете мощь генераторов ES6 , вы наверняка сможете сделать приведенный выше код намного короче.
book[Symbol.iterator] = function *(){
let properties = Object.keys(this);
for (let p of properties){
yield this[p];
}
}
Конечно, вы можете применить такое поведение ко всем объектам, сделав Object
итерируемым на уровне prototype
.
Object.prototype[Symbol.iterator] = function() {...}
Кроме того, объекты, соответствующие итеративному протоколу, можно использовать с новым оператором ES2015 spread , поэтому мы можем читать значения свойств объекта в виде массива.
let pValues = [...book];
console.log(pValues);
-------------------------
["Amazing book", "Me", 3]
Или вы можете использовать Разрушение Назначение:
let [title, , pages] = book; // notice that we can just skip unnecessary values
console.log(title);
console.log(pages);
------------------
Amazing book
3
Вы можете проверить JSFiddle со всем кодом, который я предоставил выше.