var obj = {
name: "Simon",
age: "20",
clothing: {
style: "simple",
hipster: false
}
}
for(var propt in obj){
console.log(propt + ': ' + obj[propt]);
}
Как переменная propt
представляет свойства объекта? Это не встроенный метод или свойство. Почему он подходит к каждому свойству объекта?
javascript
loops
object
Rafay
источник
источник
if (typeof(obj[propt]) === 'object') {
/ * Сделай это снова * /}
Ответы:
Для перебора свойств требуется дополнительная
hasOwnProperty
проверка:Это необходимо, потому что прототип объекта содержит дополнительные свойства для объекта, которые технически являются частью объекта. Эти дополнительные свойства унаследованы от базового класса объектов, но все еще являются свойствами
obj
.hasOwnProperty
просто проверяет, является ли это свойство специфичным для этого класса, а не наследуемым от базового класса.Также возможно вызвать
hasOwnProperty
через сам объект:Но это не удастся, если объект имеет несвязанное поле с тем же именем:
Вот почему
Object.prototype
вместо этого безопаснее звонить :источник
object.hasOwnProperty()
? Разве тот факт, чтоproperty
имеет какую-то ценность, не подразумевает, что это вobject
?property
это строка здесь, должна была быть вызванаpropertyName
. В противном случае может вызвать замешательство у JS новичков, как я, то есть, что делать внутриif
.Начиная с JavaScript 1.8.5 вы можете использовать
Object.keys(obj)
массив свойств, определенных для самого объекта (те, которые возвращают true дляobj.hasOwnProperty(key)
).Это лучше (и более читабельно), чем использование цикла for-in.
Поддерживается в следующих браузерах:
Дополнительную информацию смотрите в справочнике по объекту Mozilla Developer Network Object.keys () .
источник
Object.keys(myObject).forEach(function(key,index) { //key = the name of the object key //index = the ordinal position of the key within the object });
for candidate in candidateStatus
... кажется читабельным для меняДевочки и парни, мы находимся в 2019 году, и у нас не так много времени для набора текста ... Итак, давайте сделаем этот крутой новый модный ECMAScript 2016:
источник
obj=window.performance.memory
: - / Где, какfor in
делает. т.е.var obj = window.performance.memory; for( key in obj ) console.log( 'key=' + key + ' val=' + obj[key] );
window.performance.memory
поддерживается только Chrome иObject.keys(obj)
возвращает пустой массив. Это не имеет ничего общего с.map
.e
, я разместил эту суть. По сути, он похож на большинство реализаций хэша и использует(
(key)
=>
(value)
)
вместо него{
key
=>
value
}
, но если вам раньше не приходилось сталкиваться с этим, это могло бы помочь вам лучше его визуализировать: gist.github.com/the-nose-knows/9f06e745a56ff20519707433e28a4fa8Это
for...in statement
( спецификация MDN , ECMAScript ).Вы можете прочитать его как « для каждого свойства IN на
obj
объект, присвоить каждое свойство к PROPT переменному , в своей очереди».источник
in
оператором иfor
заявления не участвуют в общем,for-in
заявление представляет собой грамматическое по себе:for ( LeftHandSideExpression in Expression )
,for ( var VariableDeclarationNoIn in Expression )
В современных реализациях ES вы можете использовать
Object.entries
:или
Если вы просто хотите перебрать значения, используйте Object.values:
или
источник
Это просто
for...in
петля. Ознакомьтесь с документацией в Mozilla .источник
Если ваша среда поддерживает ES2017, я бы порекомендовал Object.entries :
Как показано в документации Mozillas Object.entries () :
В основном с Object.entries мы можем отказаться от следующего дополнительного шага, который требуется для старшего цикла for ... in :
источник
JQuery позволяет вам сделать это сейчас:
источник
$.each({foo:1, length:0, bar:2}, function(k,v){console.log(k,v)})
$ .each не подходит для объектов. Если объект имеет свойство длины и его значение равно нулю, весь объект обрабатывается так, как если бы он был пустым массивом.Ответ Доминика идеален, я просто предпочитаю делать это так, чтобы было чище читать:
источник
Object
верхнем регистре, хотя, нет?Приведенные выше ответы немного раздражают, потому что они не объясняют, что вы делаете внутри цикла for после того, как убедитесь, что это объект: ВЫ НЕ ПОЛУЧАЕТЕ ЕГО ПРЯМО! На самом деле вы получили только КЛЮЧ, который вам нужен для подачи заявления в OBJ:
Это все ECMA5 безопасно. Даже работает в хромых версиях JS, таких как Rhino;)
источник
Добавить использование ES2015
Reflect.ownKeys(obj)
и перебирать свойства через итератор.Например:
может быть повторен
Если вы хотите выполнять итерацию непосредственно по значениям ключей объекта, вы можете определить
iterator
, как итераторы JavaScipts по умолчанию для строк, массивов, типизированных массивов, Map и Set.JS попытается выполнить итерацию через свойство итератора по умолчанию, которое должно быть определено как
Symbol.iterator
.Если вы хотите иметь возможность перебирать все объекты, вы можете добавить его в качестве прототипа Object:
Это позволит вам перебирать значения объекта с помощью цикла for ..., например:
Внимание : на момент написания этого ответа (июнь 2018 г.) все другие браузеры, кроме IE, поддерживают генераторы и
for...of
итерацию черезSymbol.iterator
источник
источник
forEach
пропускаются пустые значения , я думаю, что вы можете избавиться от if и просто сделатьObject.keys(obj).forEach(e => console.log(`key=${e} value=${obj[e]}`));
ответ Фрэнка Рота.Цикл for ... in представляет каждое свойство объекта, поскольку оно похоже на цикл for. Вы определили propt в цикле for ... in, выполнив:
Цикл for ... in перебирает перечисляемые свойства объекта. Независимо от того, какую переменную вы определяете или помещаете в цикл for ... in, она изменяется каждый раз, когда переходит к следующему свойству, которое она выполняет. Переменная в цикле for ... in перебирает ключи, но ее значение является значением ключа. Например:
Вы можете увидеть, как переменная отличается от значения переменной. Напротив, цикл for ... делает противоположное.
Надеюсь, это поможет.
источник
источник
forEach
здесь более уместно, так какmap
он предназначен для возврата нового массива с результатами вызова блока кода на каждой итерации. Но нас интересуют только побочные эффекты каждой итерации, а не возвращаемое значение, поэтому нам не нужен тот новый массив, которыйmap
нам дает.источник
Вы можете использовать Lodash. Документация
источник
Ваш
for
цикл перебирает все свойства объектаobj
.propt
определяется в первой строке вашего цикла for. Это строка, которая является именем свойстваobj
объекта. В первой итерации циклаpropt
будет «имя».источник
Объекты в JavaScript являются коллекциями свойств и поэтому могут быть зациклены в каждом выражении.
Вы должны думать о
obj
коллекции ключевых значений.источник
В настоящее время вы можете преобразовать стандартный объект JS в итерируемый объект, просто добавив метод Symbol.iterator. Затем вы можете использовать
for of
цикл и получать его значения напрямую или даже использовать оператор распространения для объекта. Круто. Посмотрим, как мы можем это сделать:источник
function*
открытие!Если работает Node, я бы порекомендовал:
источник
Хотя самый лучший ответ верен, здесь есть альтернативный вариант использования, т.е. если вы перебираете объект и хотите в конце создать массив. Используйте
.map
вместоforEach
источник
Также добавляем рекурсивный способ:
Применение:
источник
Цикл for..in состоит в том, что он создает новую переменную (var someVariable) и затем сохраняет каждое свойство данного объекта в этой новой переменной (someVariable) по одному. Поэтому, если вы используете block {}, вы можете выполнить итерацию. Рассмотрим следующий пример.
источник
obj[someVariable]
. Возможно, причина того, что за него так много проголосовали, заключается в том, что он не рекурсивный. Так что это не будет адекватным решением, если у вас высокоструктурированный объект.Здесь я перебираю каждый узел и создаю значимые имена узлов. Если вы заметили, instanceOf Array и instanceOf Object в основном делают одно и то же (хотя в моем приложении я даю другую логику)
примечание - меня вдохновляет ответ Ондрея Свейдара. Но это решение имеет лучшую производительность и менее неоднозначно
источник
Вы в основном хотите пройтись по каждому свойству объекта.
JSFiddle
источник
obj(prop)
<- TypeError: obj не является функциейhasOwnProperty
атрибут. Это должно работать сейчас.Я хочу добавить к ответам выше, потому что у вас могут быть другие намерения от Javascript. Объект JSON и объект Javascript - это разные вещи, и вы можете захотеть перебрать свойства объекта JSON, используя решения, предложенные выше, а затем удивиться.
Предположим, что у вас есть объект JSON, такой как:
Неправильный способ перебора его «свойств»:
Вы можете быть удивлены видеть протоколирование консоли
0
,1
и т.д. , когда Перебор свойствprop1
иprop2
иprop3_1
. Эти объекты являются последовательностями, а индексы последовательности являются свойствами этого объекта в Javascript.Лучший способ рекурсивно перебрать свойства объекта JSON - это сначала проверить, является ли этот объект последовательностью или нет:
источник
Для дальнейшего уточнения принятого ответа стоит отметить, что если вы создадите экземпляр объекта с помощью
var object = Object.create(null)
затемobject.hasOwnProperty(property)
, то вызовется ошибка TypeError. Поэтому, чтобы быть в безопасности, вам нужно вызвать его из прототипа так:источник
Проверьте эту ссылку, это поможет https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_state_forin
источник