Как можно в цикле просмотреть все члены объекта JavaScript, включая значения, которые являются объектами.
Например, как я могу просмотреть это (обращаясь к "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]);
}
}
}
}
В *на ES6/2015 Вы можете цикл через объект такой: (с помощью [стрелок] функция1)
в JavaScript Объект.ключи(myObj).по каждому элементу(ключ => { консоль.(ключ журнала); // имя текущего ключа. консоль.журнал(myObj[ключ]); // значение текущего ключа. });
В ES7/2016 вы можете использовать объекта.записи
вместо `объекта.ключи и петли через объект такой:
в JavaScript Объект.записи(myObj).еогеасп(([ключ, Вэл]) => { консоль.(ключ журнала); // имя текущего ключа. консоль.журнал(вал); // значение текущего ключа. });
Выше также будет работать в качестве шутка:
в JavaScript Объект.записи(myObj).еогеасп(([ключ, Вэл]) => В консоли.журнал(ключ, Валь));
В случае, если вы хотите, чтобы цикл через вложенные объекты так же, вы можете использовать рекурсивные функция (ЕС6):
в JavaScript константный loopNestedObj = параметр obj => { Объект.ключи(объект).по каждому элементу(ключ => { если (объект[ключ] &ампер;&ампер; = = = на " вызова typeof obj-файлы[ключ]; объект") смотрите loopNestedObj(параметр obj[ключ]); // рекурсия. консоль еще.журнал(клавиша, параметр obj[ключ]); // или что-то делать с ключом и Вэл. }); };
Же, как и функция выше, но с *ES7 объект*.записи()
вместо объекта.ключи()
:
в JavaScript константный loopNestedObj = параметр obj => { Объект.записи(объект).еогеасп(([ключ, Вэл]) => { если (val &&усилителя; вал для вызова typeof = = = на "объект") смотрите loopNestedObj(вал); // рекурсия. консоль еще.журнал(ключ, Валь); // или что-то делать с ключом и Вэл. }); };
Здесь мы цикл через вложенные объекты изменение значений и возвращают новый объект в одном дыхании через объект.записи () в сочетании с Object.fromEntries()
(ES10/2019):
в JavaScript константный loopNestedObj = параметр obj => Объект.fromEntries( Объект.записи(объект).карту(([ключ, Вэл]) => { если (val &&усилителя; вал для вызова typeof = = = на "объект", у) [ключ, loopNestedObj(вал)]; // рекурсия остальные [ключ, updateMyVal(вал)]; // или что-то делать с ключом и Вэл. }) );
Используя Underscore.js’ы _.каждый
:
_.each(validation_messages, function(value, key){
_.each(value, function(value, key){
console.log(value);
});
});
Если вы используете рекурсию, вы можете вернуть свойства объекта любой глубины-
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 примеры использования и ОП не'т учтите, если он должен получить доступ к ключам в порядке их использования в процессе цикла.
✔ в ОТ
и объект.подход клавиши
let k;
for (k of Object.keys(obj)) {
/* k : key
* obj[k] : value
*/
}
let k;
for (k in obj) {
/* k : key
* obj[k] : value
*/
}
Используйте этот осторожный, так как он может печатать прототип'd свойства из объекта obj`
✔ в ES7 подход
for (const [key, value] of Object.entries(obj)) {
}
Однако, во время редактирования я не'т рекомендовать ES7 способ, потому что JavaScript инициализирует много переменных, в частности, для создания этой процедуры (см. Отзывы на доказательство). Если вы не разрабатываете огромное приложение, которое заслуживает оптимизация, то это нормально, но если оптимизация является вашим приоритетом, вы должны думать об этом.
✔ в ОТ
и объект.подход значения
let v;
for (v of Object.values(obj)) {
}
Например,
const keys = Object.keys(obj);
let i;
for (i of keys) {
//
}
// same as
for (i of Object.keys(obj)) {
//
}
Для Объекта.случае значения, использование родного
дляпетли с кэшированными переменные в Firefox, кажется, немного быстрее, чем при использовании Для...в петлю. Однако разница не столь важен и хром работает на...из
быстрее, чем родной для
петли, поэтому я бы рекомендовал использовать для...ОТ при работе с объектом.значений во всех случаях (4 и 6 тестов).
В Firefox, для...в петлю очень медленно, поэтому, когда мы хотим кэшировать ключ во время итерации, лучше использовать объект.ключи`. Плюс хром работает в обе структуры при равной скорости (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]);
}
}
}
}
В 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'
}
}
Несколько способов сделать это...
1) 2 слоя...в петле...
for (let key in validation_messages) {
const vmKeys = validation_messages[key];
for (let vmKey in vmKeys) {
console.log(vmKey + vmKeys[vmKey]);
}
}
2) Использование Объекта.ключ
Object.keys(validation_messages).forEach(key => {
const vmKeys = validation_messages[key];
Object.keys(vmKeys).forEach(key => {
console.log(vmKeys + vmKeys[key]);
});
});
3) рекурсивная функция
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);
Здесь наступает улучшение и рекурсивные версии AgileJon'ы решение ([демо](
)):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);
Это решение работает для всех видов различных глубинах.
В ECMAScript-2017, только что закончили месяц назад, вводит объект.значения(). Так что теперь вы можете сделать это:
let v;
for (v of Object.values(validation_messages))
console.log(v.your_name); // jimmy billy
Я думаю, что это's стоит отметить, что в jQuery сорта хорошо с $.каждый()
.
См.: https://api.jquery.com/each/
Например:
$('.foo').each(function() {
console.log($(this));
});
$(Этот)
быть один элемент внутри объекта. Своп $('.фу')
в переменную, если вы Don'т хотите использовать jQuery'ы селектора двигатель.
в
var obj={
name:"SanD",
age:"27"
}
Object.keys(obj).forEach((key)=>console.log(key,obj[key]));
в
Цикл через объект JavaScript, мы можем использовать foreach и оптимизации кода, мы можем использовать функцию стрелки
Я не мог'т получить постами выше не совсем то, что я был после.
После игры вокруг с других ответов здесь, я сделал это. Это'ы hacky, но это работает!
Для этого объекта:
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;
}