Существует плагин, который расширяет CSS, чтобы включить некоторые нестандартные функции, которые действительно могут помочь при разработке веб-сайтов. Он называется EQCSS .
Одна из вещей, которые добавляет EQCSS, является родительским селектором. Он работает во всех браузерах IE8 и выше. Вот формат:
@element 'a.active' {
$parent {
background: red;
}
}
Итак, здесь мы открыли запрос элемента для каждого элемента a.active
, а для стилей внутри этого запроса такие вещи, как $parent
, имеют смысл, потому что есть контрольная точка , Браузер может найти родителя, потому что он очень похож на parentNode
в JavaScript.
Вот демонстрация $parent
и еще одной демонстрации $parent
, которая работает в IE8 , а также снимок экрана, если у вас нет IE8 для тестирования с помощью .
EQCSS также включает в себя метаселектора $prev
для элемента перед выбранным элементом, $this
только для тех элементов, которые соответствуют запросу элемента, и многое другое.
Ваш цикл for
выполняет итерацию по всем свойствам объекта obj
. propt
определяется в первой строке цикла for. Это строка, которая является именем свойства объекта obj
. На первой итерации цикла propt
будет «name».
Ответ Dominik's идеален, я просто предпочитаю делать это так, как это чище читать:
for (var property in object) {
if (!object.hasOwnProperty(property)) continue;
// Do stuff...
}
Это for...in statement
( MDN , ECMAScript spec ).
Вы можете прочитать это как «ДЛЯ каждого свойства IN obj
объект, каждый раз присваивает каждое свойство переменной PROPT ".
in
и оператор for
вообще не участвуют, инструкция for-in
представляет собой произведение грамматики сама по себе: for ( LeftHandSideExpression in Expression )
, for ( var VariableDeclarationNoIn in Expression )
– CMS
29 November 2011 в 17:08
Чтобы добавить ES2015 к использованию Reflect.ownKeys(obj)
, а также итерации по свойствам через итератор.
Например:
let obj = { a: 'Carrot', b: 'Potato', Car: { doors: 4 } };
можно повторить с помощью
// logs each key
Reflect.ownKeys(obj).forEach(key => console.log(key));
Если вы хотите выполнить итерацию непосредственно над значениями ключей объекта, вы можете определить iterator
, как и итераторы по умолчанию для JavaScipts для строк, массивов, типизированных массивов, Map и Set.
JS будет пытаться выполнить итерацию с использованием свойства iterator по умолчанию, которое должно быть определено как Symbol.iterator
.
Если вы хотите иметь возможность итерации по всем объектам, вы можете добавить его в качестве прототипа объекта:
Object.prototype[Symbol.iterator] = function*() {
for(p of Reflect.ownKeys(this)){ yield this[p]; }
}
Это позволит вам выполнять итерацию по значениям объекта с помощью цикла for for ..., например:
for(val of obj) { console.log('Value is:' + val ) }
Внимание: в качестве написав этот ответ (июнь 2018 г.) обо всех других браузерах, но IE, генераторы поддержки и for...of
итерации через Symbol.iterator
Вышеупомянутые ответы немного раздражают, потому что они не объясняют, что вы делаете внутри цикла 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, таких как Rhino;)
Здесь я повторяю каждый узел и создаю значимые имена узлов. Если вы заметили, instanceOf Array и instanceOf Object в значительной степени выполняют одно и то же (в моем приложении я использую другую логику)
function iterate(obj,parent_node) {
parent_node = parent_node || '';
for (var property in obj) {
if (obj.hasOwnProperty(property)) {
var node = parent_node + "/" + property;
if(obj[property] instanceof Array) {
//console.log('array: ' + node + ":" + obj[property]);
iterate(obj[property],node)
} else if(obj[property] instanceof Object){
//console.log('Object: ' + node + ":" + obj[property]);
iterate(obj[property],node)
}
else {
console.log(node + ":" + obj[property]);
}
}
}
}
note - Я вдохновлен ответом Ondrej Svejdar. Но это решение имеет лучшую производительность и менее двусмысленный
Object.keys(obj).forEach(key =>
console.log(`key=${key} value=${obj[key]}`)
);
Девочки и ребята, мы в 2017 году, и у нас нет такого количества времени для набора текста ... Итак, давайте сделаем этот новый классный ECMAScript 2016:
Object.keys(obj).forEach(e => console.log(`key=${e} value=${obj[e]}`));
()
вокруг аргумента e
... Object.keys(obj).map(e => console.log(`key=${e} value=${obj[e]}`))
– Grant
3 May 2017 в 02:39
forEach
здесь более уместно. map()
более подходит, если вы хотите преобразовать данные и использовать значение, возвращаемое функцией map()
. Когда вы используете forEach
, вы явно указываете, что выполняете только итерации для побочных эффектов, а не для преобразования.
– Ski
31 October 2017 в 13:52
Вы в основном хотите перебирать каждое свойство в объекте.
var Dictionary = {
If: {
you: {
can: '',
make: ''
},
sense: ''
},
of: {
the: {
sentence: {
it: '',
worked: ''
}
}
}
};
function Iterate(obj) {
for (prop in obj) {
if (obj.hasOwnProperty(prop) && isNaN(prop)) {
console.log(prop + ': ' + obj[prop]);
Iterate(obj[prop]);
}
}
}
Iterate(Dictionary);
hasOwnProperty
. Теперь он должен работать.
– HovyTech
23 June 2016 в 22:29
Я хочу добавить к ответам выше, потому что у вас могут быть разные намерения от Javascript. Объект JSON и объект Javascript - это разные вещи, и вы можете захотеть итерации через свойства объекта JSON с помощью предложенных выше решений, а затем удивляться.
Предположим, что у вас есть объект JSON, например:
var example = {
"prop1": "value1",
"prop2": [ "value2_0", value2_1"],
"prop3": {
"prop3_1": "value3_1"
}
}
Неправильный путь для итерации через его «свойства»:
function recursivelyIterateProperties(jsonObject) {
for (var prop in Object.keys(example)) {
console.log(prop);
recursivelyIterateProperties(jsonObject[prop]);
}
}
Возможно, удивлен, увидев ведение журнала консоли 0
, 1
и т. д. при повторении через свойства prop1
и prop2
и prop3_1
. Эти объекты являются последовательностями, а индексы последовательности являются свойствами этого объекта в Javascript.
Лучший способ рекурсивной итерации через свойства объекта JSON состоял в том, чтобы сначала проверить, является ли этот объект последовательностью или нет :
function recursivelyIterateProperties(jsonObject) {
for (var prop in Object.keys(example)) {
console.log(prop);
if (!(typeof(jsonObject[prop]) === 'string')
&& !(jsonObject[prop] instanceof Array)) {
recursivelyIterateProperties(jsonObject[prop]);
}
}
}
Итерация по свойствам требует этой дополнительной проверки hasOwnProperty
:
for (var property in object) {
if (object.hasOwnProperty(property)) {
// do stuff
}
}
Это необходимо, потому что прототип объекта содержит дополнительные свойства для объекта, которые являются технически частью объекта. Эти дополнительные свойства наследуются от класса базового объекта, но все еще являются свойствами object
.
hasOwnProperty
просто проверяет, является ли это свойством, специфичным для этого класса , а не один, унаследованный от базового класса.
object.hasOwnProperty()
? Разве тот факт, что property
имеет какое-либо значение, означает, что его в object
?
– Alex S
21 April 2014 в 20:48
property
является строкой здесь, ее нужно было бы назвать propertyName
. В противном случае может возникнуть путаница для новичков JS, таких как я, т. Е. Что делать внутри if
.
– Neolisk
20 July 2016 в 15:57
Если ваша среда поддерживает ES2017, я бы рекомендовал Object.entries:
Object.entries(obj).forEach(([key, value]) => {
console.log(`${key} ${value}`);
});
Как показано в документации Mozillas Object.entries () :
Метод Object.entries () возвращает массив собственных пар элементов enumerable property [key, value] в том же порядке, что и для цикла for for ... in (разница в том, что a для -in loop также перечисляет свойства в цепочке прототипов.
В основном с Object.entries мы можем отказаться от следующего дополнительного шага, который требуется для более старого для ... in loop:
// This step is not necessary with Object.entries if (object.hasOwnProperty(property)) { // do stuff }
Если вы используете Node, я бы рекомендовал:
Object.keys(obj).forEach((key, index) => {
console.log(key);
});
Чтобы уточнить принятый ответ, стоит отметить, что если вы создаете экземпляр объекта с помощью var object = Object.create(null)
, тогда object.hasOwnProperty(property)
вызовет TypeError. Чтобы быть в безопасности, вам нужно вызвать его из прототипа следующим образом:
for (var property in object) {
if (Object.prototype.hasOwnProperty.call(object, property)) {
// do stuff
}
}
Это всего лишь цикл for...in
. Проверьте документацию в Mozilla .
Также добавление рекурсивного пути:
function iterate(obj) {
// watch for objects we've already iterated so we won't end in endless cycle
// for cases like var foo = {}; foo.bar = foo; iterate(foo);
var walked = [];
var stack = [{obj: obj, stack: ''}];
while(stack.length > 0)
{
var item = stack.pop();
var obj = item.obj;
for (var property in obj) {
if (obj.hasOwnProperty(property)) {
if (typeof obj[property] == "object") {
// check if we haven't iterated through the reference yet
var alreadyFound = false;
for(var i = 0; i < walked.length; i++)
{
if (walked[i] === obj[property])
{
alreadyFound = true;
break;
}
}
// new object reference
if (!alreadyFound)
{
walked.push(obj[property]);
stack.push({obj: obj[property], stack: item.stack + '.' + property});
}
}
else
{
console.log(item.stack + '.' + property + "=" + obj[property]);
}
}
}
}
}
Использование:
iterate({ foo: "foo", bar: { foo: "foo"} });
Вы можете использовать Lodash. Документация
var obj = {a: 1, b: 2, c: 3};
_.keys(obj).forEach(function (key) {
...
});
let obj = {"a": 3, "b": 2, "6": "a"}
Object.keys(obj).map((item) => {console.log("item", obj[item])})
// a
// 3
// 2
Что для цикла ... в том, что он создает новую переменную (var someVariable), а затем сохраняет каждое свойство данного объекта в этой новой переменной (someVariable) один за другим. Поэтому, если вы используете block {}, вы можете выполнять итерацию. Рассмотрим следующий пример.
var obj = {
name:'raman',
hobby:'coding',
planet:'earth'
};
for(var someVariable in obj) {
//do nothing..
}
console.log(someVariable); // outputs planet
obj[someVariable]
. Возможно, причина, по которой она была занижена, - это потому, что она не рекурсивна. Таким образом, это не будет адекватным решением, если у вас есть структурированный объект.
– Katharine Osborne
27 April 2018 в 09:50
В настоящее время вы можете преобразовать стандартный объект JS в итерируемый объект, просто добавив метод Symbol.iterator. Затем вы можете использовать цикл for of
и использовать его значения напрямую или даже использовать оператор распространения на объекте. Круто. Посмотрим, как мы можем это сделать:
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);
jquery позволяет сделать это сейчас:
$.each( obj, function( key, value ) {
alert( key + ": " + value );
});
$.each({foo:1, length:0, bar:2}, function(k,v){console.log(k,v)})
$ .each не подходит для объектов. Если объект имеет свойство length, а его значение равно нулю, весь объект обрабатывается так, как если бы он был пустым массивом.
– Bob Stein
4 April 2018 в 12:25
Начиная с JavaScript 1.8.5 вы можете использовать Object.keys(obj)
для получения массива свойств, определенных на самом объекте (те, которые возвращают true для obj.hasOwnProperty(key)
).
Object.keys(obj).forEach(function(key,index) {
// key: the name of the object key
// index: the ordinal position of the key within the object
});
Это (и более читаемым), чем использование цикла in-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 });
– Todd Price
6 November 2014 в 19:46
Объекты в JavaScript являются наборами свойств и поэтому могут быть закодированы в a для каждого оператора.
Вы должны думать о obj
как о наборе значений ключей.
Цикл for ... in представляет каждое свойство в объекте, потому что он похож на цикл for. Вы определили propt в цикле for ... in, выполнив:
for(var propt in obj){
alert(propt + ': ' + obj[propt]);
}
A for ... in loop итерации через перечислимые свойства объекта. Какую бы переменную вы не определяли или не вводили в цикл for ... in, каждый раз, когда она переходит к следующему свойству, она выполняет итерацию. Переменная в цикле for ... in повторяется через клавиши, но значение этого значения является значением ключа. Например:
for(var propt in obj) {
console.log(propt);//logs name
console.log(obj[propt]);//logs "Simon"
}
Вы можете видеть, как переменная отличается от значения переменной. Напротив, a для ... цикла делает обратное.
Надеюсь, это поможет.