В ECMAScript 5 вы можете объединить

Например, как я могу пройти через это (доступ к «your_name» и «your_message» для каждого)?

var validation_messages = {
    "key_1": {
        "your_name": "jimmy",
        "your_msg": "hello world"
    },
    "key_2": {
        "your_name": "billy",
        "your_msg": "foo equals bar"
    }
}
for (var key in validation_messages) {
    // skip loop if the property is from prototype
    if (!validation_messages.hasOwnProperty(key)) continue;

    var obj = validation_messages[key];
    for (var prop in obj) {
        // skip loop if the property is from prototype
        if(!obj.hasOwnProperty(prop)) continue;

        // your code
        alert(prop   " = "   obj[prop]);
    }
}

. В ECMAScript 5 вы можете комбинировать Object.keys() и Array.prototype.forEach():

var obj = {
  first: "John",
  last: "Doe"
};

//
//	Visit non-inherited enumerable keys
//
Object.keys(obj).forEach(function(key) {

  console.log(key, obj[key]);

});

. Проблема с этим

for (var key in validation_messages) {
   var obj = validation_messages[key];
   for (var prop in obj) {
      alert(prop   " = "   obj[prop]);
   }
}

заключается в том, что вы также будете проходить через прототип примитивного объекта.

С этим вы избежите :

for (var key in validation_messages) {
   if (validation_messages.hasOwnProperty(key)) {
      var obj = validation_messages[key];
      for (var prop in obj) {
         if (obj.hasOwnProperty(prop)) {
            alert(prop   " = "   obj[prop]);
         }
      }
   }
}

закрытии JavaScript внутри циклов — простой практический пример — переполнение стека ES6 , вы можете перебрать объект, подобный следующему: (используя . Функция стрелки С чем вы столкнулись

Object.keys(myObj).forEach(key => {
    console.log(key);          // the name of the current key.
    console.log(myObj[key]);   // the value of the current key.
});

jsbin

закрытии JavaScript внутри циклов — простой практический пример — переполнение стека ES7 вы можете использовать Object.entries вывод будет: Object.keys и переберите объект наподобие этого:

Object.entries(myObj).forEach(([key, val]) => {
    console.log(key);          // the name of the current key.
    console.log(val);          // the value of the current key.
});

выше также работа как однострочник :

Object.keys(myObj).forEach(key => console.log(key, myObj[key]));

, показывающий использование из jQuery:

Я использую URL.createObjectURL () метод. Для получения externalHTML в качестве строки вы можете использовать это так:

const loopNestedObj = (obj) => {
  Object.keys(obj).forEach(key => {
    if (obj[key] && typeof obj[key] === 'object') loopNestedObj(obj[key]);  // recurse.
    else console.log(key, obj[key]);  // or do something with key and val.
  });
};

объекты первого класса

, поэтому, будучи объектом, вы можете назначить свойства функции. Object.entries вывод будет: Object.keys:

const loopNestedObj = (obj) => {
  Object.entries(obj).forEach(([key, val]) => {
    if (val && typeof val === 'object') loopNestedObj(val);  // recurse.
    else console.log(key, val);  // or do something with key and val.
  });
};

Вы можете использовать , позволяющий получить криптографически сильные случайные значения. Массив, заданный в качестве параметра, заполняется случайными числами (случайными в своем криптографическом значении). , что является сокращением для Object.keys в качестве аргументов. Object.entries перечислить объект, затем обработать значения и затем использовать reduce() для преобразования обратно в новый объект. { *} для поддержки создания цепочек. Здесь для объекта определена функция

const loopNestedObj = (obj) => 
  Object.keys(obj)
    // Use .filter(), .map(), etc. if you need.
    .reduce((newObj, key) => 
      (obj[key] && typeof obj[key] === 'object') ?
        {...newObj, [key]: loopNestedObj(obj[key])} :  // recurse.
        {...newObj, [key]: obj[key]},                  // Define value.
      {});

массивов https://caniuse.com/ # feat = getrandomvalues ​​_.each:

_.each(validation_messages, function(value, key){
    _.each(value, function(value, key){
        console.log(value);
    });
});

Возвращает ровно 5 случайных символов, в отличие от некоторых ответов с наибольшим рейтингом, найденных здесь.

function lookdeep(object){
    var collection= [], index= 0, next, item;
    for(item in object){
        if(object.hasOwnProperty(item)){
            next= object[item];
            if(typeof next== 'object' && next!= null){
                collection[index  ]= item  
                ':{ '  lookdeep(next).join(', ') '}';
            }
            else collection[index  ]= [item ':' String(next)];
        }
    }
    return collection;
}

//example

var O={
    a:1, b:2, c:{
        c1:3, c2:4, c3:{
            t:true, f:false
        }
    },
    d:11
};
var lookdeepSample= 'O={'  lookdeep(O).join(',n') '}';


/*  returned value: (String)
O={
    a:1, 
    b:2, 
    c:{
        c1:3, c2:4, c3:{
            t:true, f:false
        }
    },
    d:11
}

*/

Если вы ориентируетесь на современные браузеры и у вас нет необходимости в экстравагантных стилях: . У оригинала есть два недостатка, которые рассматриваются здесь: . Я думаю, что есть 2 варианта использования, и ОП не упомянул, нужен ли ему доступ к ключам, чтобы использовать их во время цикла.

Вот некоторый код, взятый из него, который я модифицировал, чтобы получить полный пример, который, мы надеемся, принесет пользу сообществу, потому что его можно использовать как шаблон дизайна для классов.

Для целей отладки я использую: of и Object.keys подхода

let k;
for (k of Object.keys(obj)) {

    /*        k : key
     *   obj[k] : value
     */
}

Для целей отладки я использую: in подхода

let k;
for (k in obj) {

    /*        k : key
     *   obj[k] : value
     */
}

Используйте это с осторожностью, так как он может распечатать свойства prototype’d obj

Approach подход ES7

for (const [key, value] of Object.entries(obj)) {

}

Однако, во время редактирования я не рекомендовал бы метод ES7, потому что JavaScript инициализирует множество переменных для создания этой процедуры (см. Отзывы для доказательства). Вы не разрабатываете огромное приложение, которое заслуживает оптимизации, тогда все в порядке, но если оптимизация является вашим приоритетом, вы должны подумать об этом.

II. нам просто нужно получить доступ к каждому значению,

Для целей отладки я использую: of и Object.values подхода

let v;
for (v of Object.values(obj)) {

}

Дополнительные отзывы о тестах:

  • Кэширование Object.keys или Object.values В таблице также используется подход с использованием искусственного столбца, в котором цвет фона самого контейнера используется в качестве фона для элементов заголовка, которые являются прозрачными .

Например,

const keys = Object.keys(obj);
let i;
for (i of keys) {
  //
}
// same as
for (i of Object.keys(obj)) {
  //
}
  • вернет Object.values в случае использования собственного for цикл с кэшированными переменными в Firefox кажется немного быстрее, чем использование for...of. Однако разница не так уж важна, и Chrome выполняет for...of быстрее, чем собственная for, поэтому я бы порекомендовал использовать for...of при работе с Object.values в любых случаях (4-й и 6-й тесты).

  • — Как получить атрибут data-id? — Переполнение стека for...in цикл действительно медленный, поэтому, когда мы хотим кешировать Во время итерации лучше использовать Object.keys. Плюс Chrome работает обе структуры с одинаковой скоростью (1-й и последний тесты).

Вы можете проверить тесты здесь: https://jsperf.com/es7-and-misc-loops

Я знаю, что это уже поздно, но это заняло 2 минуты, чтобы написать эту оптимизированную и улучшенную версию ответа AgileJon:

var key, obj, prop, owns = Object.prototype.hasOwnProperty;

for (key in validation_messages ) {

    if (owns.call(validation_messages, key)) {

        obj = validation_messages[key];

        for (prop in obj ) {

            // using obj.hasOwnProperty might cause you headache if there is
            // obj.hasOwnProperty = function(){return false;}
            // but owns will always work 
            if (owns.call(obj, prop)) {
                console.log(prop, "=", obj[prop]);
            }

        }

    }

}
for(var k in validation_messages) {
    var o = validation_messages[k];
    do_something_with(o.your_name);
    do_something_else_with(o.your_msg);
}

p это значение

for (var key in p) {
  alert(key   ' => '   p[key]);
}

или

Object.keys(p).forEach(key => { console.log(key, p[key]) })

В ES7 вы можете делать:

for (const [key, value] of Object.entries(obj)) {
  //
}
for(var key in validation_messages){
    for(var subkey in validation_messages[key]){
        //code here
        //subkey being value, key being 'yourname' / 'yourmsg'
    }
}

Вот улучшенная и рекурсивная версия решения AgileJon ({ *}, который ответит на Jake Archibald на HTML5 Rocks. ):

function loopThrough(obj){
  for(var key in obj){
    // skip loop if the property is from prototype
    if(!obj.hasOwnProperty(key)) continue;

    if(typeof obj[key] !== 'object'){
      //your code
      console.log(key " = " obj[key]);
    } else {
      loopThrough(obj[key]);
    }
  }
}
loopThrough(validation_messages);

. Это решение работает для всех видов различной глубины.

Другой вариант:

var testObj = {test: true, test1: false};
for(let x of Object.keys(testObj)){
    console.log(x);
}

ECMAScript-2017, только что завершенный месяц назад, представляет Object.values (). Итак, теперь вы можете сделать это:

let v;
for (v of Object.values(validation_messages))
   console.log(v.your_name);   // jimmy billy

Несколько способов сделать что …

1) 2 слоя для … in loop …

for (let key in validation_messages) {
   const vmKeys = validation_messages[key];
   for (let vmKey in vmKeys) {
      console.log(vmKey   vmKeys[vmKey]);
   }
}

Если у вас все в порядке с использованием плагинов, вот один из них, который я протестировал. Хорошо работает, кроме пасты. using Object.key

Object.keys(validation_messages).forEach(key => {
   const vmKeys = validation_messages[key];
   Object.keys(vmKeys).forEach(key => {
    console.log(vmKeys   vmKeys[key]);
   });
});

3) для возврата пользовательского объекта, защищающего функции, на которые класс полагается, но которые должны быть представлены. Это объясняется далее в главе 2 (Объекты) серии статей.

const recursiveObj = obj => {
  for(let key in obj){
    if(!obj.hasOwnProperty(key)) continue;

    if(typeof obj[key] !== 'object'){
      console.log(key   obj[key]);
    } else {
      recursiveObj(obj[key]);
    }
  }
}

и назовите его следующим образом:

recursiveObj(validation_messages);

: $.each() Глядя на вывод

следующим образом: (0..9 A..Z a..z = 62)

Также смотрите

$('.foo').each(function() {
    console.log($(this));
});

$(this) является единственным элементом внутри объекта. Swap $('.foo') для переменной, если вы не хотите использовать механизм выбора jQuery.

var obj={
name:"SanD",
age:"27"
}
Object.keys(obj).forEach((key)=>console.log(key,obj[key]));

Для циклического прохождения объекта JavaScript мы можем использовать forEach, а для оптимизации кода мы можем использовать функцию стрелки

, который я не мог не заставляйте вышеупомянутые посты делать то, что я хотел.

После игры с другими ответами здесь, я сделал это. Это взломано, но это работает!

Для этого объекта:

var myObj = {
    pageURL    : "BLAH",
    emailBox   : {model:"emailAddress", selector:"#emailAddress"},
    passwordBox: {model:"password"    , selector:"#password"}
};

… этот код:

// Get every value in the object into a separate array item ...
function buildArray(p_MainObj, p_Name) {
    var variableList = [];
    var thisVar = "";
    var thisYes = false;
    for (var key in p_MainObj) {
       thisVar = p_Name   "."   key;
       thisYes = false;
       if (p_MainObj.hasOwnProperty(key)) {
          var obj = p_MainObj[key];
          for (var prop in obj) {
            var myregex = /^[0-9]*$/;
            if (myregex.exec(prop) != prop) {
                thisYes = true;
                variableList.push({item:thisVar   "."   prop,value:obj[prop]});
            }
          }
          if ( ! thisYes )
            variableList.push({item:thisVar,value:obj});
       }
    }
    return variableList;
}

// Get the object items into a simple array ...
var objectItems = buildArray(myObj, "myObj");

// Now use them / test them etc... as you need to!
for (var x=0; x < objectItems.length;   x) {
    console.log(objectItems[x].item   " = "   objectItems[x].value);
}

… производит это в консоли:

myObj.pageURL = BLAH
myObj.emailBox.model = emailAddress
myObj.emailBox.selector = #emailAddress
myObj.passwordBox.model = password
myObj.passwordBox.selector = #password

Решение, которое работает для меня, заключается в следующем

_private.convertParams=function(params){
    var params= [];
    Object.keys(values).forEach(function(key) {
        params.push({"id":key,"option":"Igual","value":params[key].id})
    });
    return params;
}

В моем случае (на основании предыдущего) возможно любое количество уровней.

var myObj = {
    rrr: undefined,
    pageURL    : "BLAH",
    emailBox   : {model:"emailAddress", selector:"#emailAddress"},
    passwordBox: {model:"password"    , selector:"#password"},
    proba: {odin:{dva:"rr",trr:"tyuuu"}, od:{ff:5,ppa:{ooo:{lll:'lll'}},tyt:'12345'}}
};


function lookdeep(obj,p_Name,gg){
    var A=[], tem, wrem=[], dd=gg?wrem:A;
    for(var p in obj){
        var y1=gg?'':p_Name, y1=y1   '.'   p;
        if(obj.hasOwnProperty(p)){
           var tem=obj[p];
           if(tem && typeof tem=='object'){
               a1=arguments.callee(tem,p_Name,true);
               if(a1 && typeof a1=='object'){for(i in a1){dd.push(y1   a1[i])};}
            }
            else{
               dd.push(y1   ':'   String(tem));
            }
        }
    };
    return dd
};


var s=lookdeep(myObj,'myObj',false);
for (var x=0; x < s.length;   x) {
console.log(s[x] 'n');}

результат:

["myObj.rrr:undefined",
"myObj.pageURL:BLAH",
"myObj.emailBox.model:emailAddress",
"myObj.emailBox.selector:#emailAddress",
"myObj.passwordBox.model:password",
"myObj.passwordBox.selector:#password",
"myObj.proba.odin.dva:rr",
"myObj.proba.odin.trr:tyuuu",
"myObj.proba.od.ff:5",
"myObj.proba.od.ppa.ooo.lll:lll",
"myObj.proba.od.tyt:12345"]

Не тот ответ, который вы ищете? Просмотрите другие вопросы с тегами . Для разработки ответа Стивена Спилберга я сделал это в таком случае: { *} Выражение задайте свой вопрос Глядя на вывод