var obj = {
name: "Simon",
age: "20",
clothing: {
style: "simple",
hipster: false
}
}
for(var propt in obj){
console.log(propt + ': ' + obj[propt]);
}
Как переменная propt
представляет свойства объекта? Это'не встроенный метод или свойство. Почему она появляется при каждом свойстве объекта?
Определения свойств, которые требует этот дополнительный метод hasOwnProperty проверить:
for (var prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
// do stuff
}
}
Это'ы необходимо, поскольку объект'ы прототип содержит дополнительные свойства для объекта, которые технически являются частью объекта. Эти дополнительные свойства наследуются от базового класса Object, но по-прежнему свойств в obj
.
hasOwnProperty
просто проверяет, чтобы увидеть, если это собственность, характерные для этого класса, и не один наследуется от базового класса.
Это's также можно назвать метод hasOwnProperty
через сам объект:
if (obj.hasOwnProperty(prop)) {
// do stuff
}
Но это будет ошибкой, если объект имеет другой области с таким же названием:
var obj = { foo: 42, hasOwnProperty: 'lol' };
obj.hasOwnProperty('foo'); // TypeError: hasOwnProperty is not a function
Что's, почему это'ы безопаснее вызвать его через объект.прототип вместо:
var obj = { foo: 42, hasOwnProperty: 'lol' };
Object.prototype.hasOwnProperty.call(obj, 'foo'); // true
Как в JavaScript 1.8.5 вы можете использовать объект.ключи(объект), чтобы получить массив свойств определены в самом объекте (те, которые возвращают true для объекта obj.метод hasOwnProperty(ключ)`).
Object.keys(obj).forEach(function(key,index) {
// key: the name of the object key
// index: the ordinal position of the key within the object
});
Это лучше (и более читаемым), чем использование Для-в петлю.
Его поддерживается в следующих браузерах:
См. сеть разработчик Mozilla объекта.ключи()'ы reference для получения дополнительной информации.
Девушки и парни мы в 2019 году, и мы не имеют много времени для ввода... так давайте сделаем этот прохладный новый фантазии в ECMAScript 2016:
Object.keys(obj).forEach(e => console.log(`key=${e} value=${obj[e]}`));
Это for...in statement
(MDN, ECMAScript spec).
Вы можете прочитать его как "ПЕРЕД каждым свойством ВНУТРИ объекта obj
, присвойте каждое свойство переменной PROPT по очереди".
В современных реализациях Эс, вы можете использовать Object .записи
:
for (const [key, value] of Object.entries(obj)) { }
или
Object.entries(obj).forEach(([key, value]) => ...)
Если вы просто хотите, чтобы выполнить итерации по значениям, а затем использовать объект.значения:
for (const value of Object.values(obj)) { }
или
Object.values(obj).forEach(value => ...)
Если среда поддерживает ES2017 тогда я бы порекомендовал объекта.записи:
Object.entries(obj).forEach(([key, value]) => {
console.log(`${key} ${value}`);
});
Как показано в объект Mozillas.записи() документация: и GT; объект.записи() метод возвращает массив заданного объекта's собственное
перечислимое свойство [ключ, значение] пар, в том же порядке, что предоставленных для...в цикл (разница в том, что для-в петлю перечисляет свойства в цепочке прототипов так же).
В основном с объекта.записи мы можем забыть следующие дополнительные шаги, необходимые со старшими по...в цикл:
// This step is not necessary with Object.entries
if (object.hasOwnProperty(property)) {
// do stuff
}
jQuery позволяет вам сделать это сейчас:
$.each( obj, function( key, value ) {
alert( key + ": " + value );
});
Доминик'С ответ: замечательно, я просто предпочитаю делать это таким образом, как это'ы очиститель для чтения:
for (var property in object) {
if (!object.hasOwnProperty(property)) continue;
// Do stuff...
}
В вышеуказанных ответах немного раздражает, потому что они Дон'т объяснить, что вы делаете внутри цикла for после того, как вы убедитесь, что он'ы объект: вы не'Т получить доступ к нему напрямую! Вы фактически поставлено только ключ, который необходимо применить к папке obj:
var obj = {
a: "foo",
b: "bar",
c: "foobar"
};
// We need to iterate the string keys (not the objects)
for(var someKey in obj)
{
// We check if this key exists in the obj
if (obj.hasOwnProperty(someKey))
{
// someKey is only the KEY (string)! Use it to get the obj:
var myActualPropFromObj = obj[someKey]; // Since dynamic, use [] since the key isn't literally named "someKey"
// NOW you can treat it like an obj
var shouldBeBar = myActualPropFromObj.b;
}
}
Это все ECMA5 безопасный. Работает даже в Хромой от JS версии, как носорог ;)
Чтобы добавить ES2015'использование с учетом.ownKeys(объект)` а также обходя свойства через итератор.
Например:
let obj = { a: 'Carrot', b: 'Potato', Car: { doors: 4 } };
может использоваться на
// logs each key
Reflect.ownKeys(obj).forEach(key => console.log(key));
Если вы хотите, чтобы выполнить итерации непосредственно над значениями ключей объекта, вы можете определить итератор
, как JavaScipts'ы по умолчанию итераторы для строк, массивов, типизированные массивы, карта и набор.
На JS будет пытаться выполнить итерации через итератор по умолчанию имущество, которое должно быть определено как символ.итератор
.
Если вы хотите быть в состоянии перебрать все объекты можно добавить в качестве прототипа объекта:
Object.prototype[Symbol.iterator] = function*() {
for(p of Reflect.ownKeys(this)){ yield this[p]; }
}
Это позволит вам перебрать значения объекта для...цикла, например:
for(val of obj) { console.log('Value is:' + val ) }
Внимание: на момент написания этого ответа (июнь 2018) всех других браузерах, но IE, генераторов поддержка и для...из итерации через символ.итератор`
Для...в петлю представляет каждое свойство в объекте, потому что это просто, как для петли. Вы определили propt в...в петле, выполнив:
for(var propt in obj){
alert(propt + ': ' + obj[propt]);
}
Для...в цикле перебор свойств объекта. Какой переменной можно определить, или положить в...в петле, изменения каждый раз, когда он переходит к следующему свойству он перебирает. Переменная в течение...в цикле перебирает ключи, но стоимость его является ключом's стоимостью. Например:
for(var propt in obj) {
console.log(propt);//logs name
console.log(obj[propt]);//logs "Simon"
}
Вы можете увидеть, как переменная отличается от переменной's стоимостью. В отличие от этого, для...петли делает противоположное.
Я надеюсь, что это помогает.
Object.keys(obj).forEach(key =>
console.log(`key=${key} value=${obj[key]}`)
);
Вы можете использовать lodash. [Документации][1]
var obj = {a: 1, b: 2, c: 3};
_.keys(obj).forEach(function (key) {
...
});
[1]: https://lodash.com/docs/4.16.6#keys на "документация"и
Объекты в JavaScript представляют собой наборы свойств, и поэтому могут передаваться в каждой инструкции.
Вы должны думать о объект obj
в качестве ключей значение.
В настоящее время вы можете конвертировать стандартные в JS объект в итерируемый объект, просто добавив символ.методом iterator. Затем вы можете использовать для
петли и посещение его значения непосредственно или даже можете использовать операторов на объекте. Круто. Позвольте'посмотрим, как мы можем сделать это:
в
var o = {a:1,b:2,c:3},
a = [];
o[Symbol.iterator] = function*(){
var ok = Object.keys(this);
i = 0;
while (i < ok.length) yield this[ok[i++]];
};
for (var value of o) console.log(value);
// or you can even do like
a = [...o];
console.log(a);
в
Типы способ итерировать объект в JavaScript
ПО...в петля
по...ОТ петля
цикл foreach() способ
карта() способ
в
let obj = {
city1: 'BOM',
city2: 'BLR',
city3: 'HYD',
state: {
city1: 'Sub-city1',
city2: 'Sub-city2'
}
}
console.log('----------------using for...in loop------')
for(let entry in obj)
console.log(entry +" -> "+ obj[entry])
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key + " -> " + obj[key]);
}
}
console.log('----------------using for...of loop------')
for (const key of Object.keys(obj))
console.log(key +" -> "+ obj[key]);
for (const [key, value] of Object.entries(obj))
console.log(key +" -> "+ value);
console.log('----------------using forEach loop------')
Object.entries(obj).forEach(([key, value]) => console.log(key +" -> "+ value));
console.log('----------------using map function------')
Object.entries(obj).map(([k,v])=> console.log(k+' -> '+v))
в
Способ, чтобы выполнить итерации вложенного объекта
в
let obj = {
city1: 'ALD',
city2: 'BLR',
city3: 'HYD',
state: {
city4: 'Sub-city1',
city5: 'Sub-city2'
}
}
function nestedObj(obj) {
for (let key in obj) {
// checking if it's nested to iterate again
if (obj.hasOwnProperty(key) &&
(typeof obj[key] === "object")) {
nestedObj(obj[key])
} else {
// showing the flat attributes
console.log(key + " -> " + obj[key]);
}
}
}
nestedObj(obj);
в
В то время как топ-рейтинг ответ правильный, здесь это альтернативный вариант использования я.e если вы итерации над объектом и хотите создать массив, в конце концов. Использование .карте
вместо объекту
const newObj = Object.keys(obj).map(el => {
//ell will hold keys
// Getting the value of the keys should be as simple as obj[el]
})