2015-10-13 3 views
-1

У меня есть JavaScript Object с несколькими вложенными объектами, как это:Итерация через объект, который вложен объекты в nodeJs

var stats = { 
    bookServed: { 
     redis: 90, 
     s3: 90, 
     signedUrl: 70 
    }, 
    errors: { 
     redis: { 
      bookService: 70, 
      mapi: 50, 
      capi: 30 
     }, 
     AWS: { 
      signedUrl: 70, 
      downloadBook: 50, 
      searchBook: 10 
     }, 
     decryption: 60 
    } 
}; 

Что бы чистейший способ перебора всех его свойств и установить каждое значение 0 например. Я написал что-то вроде этого

for (var property in stats) { 
    if (stats.hasOwnProperty(property)) { 
     if (typeof property === "object") { 
      for (var sub_property in property) 
       if (property.hasOwnProperty(sub_property)) { 
        sub_property = 0 
       } 
     } else { 
      property = 0; 
     } 
    } 
} 

Я хочу использовать библиотеку, такую ​​как underscore.js, для правильной работы задачи.

+0

Любой библиотеку вы используете будет использовать аналогичный метод рекурсивного цикла. Я предполагаю, что у вас есть работы, и вы просто ищете что-то ... «чище» * (что бы это ни значило) *? –

+0

Мое решение работает только для 2 уровней вложенных объектов, в моем примере у меня 3 уровня, поэтому я хочу, чтобы что-то рекурсивное перешло на самый глубокий уровень, независимо от того, сколько уровней у меня в объекте. – Amaynut

+0

поэтому сделайте функцию, которая выполняет этот шаг, и если объект найден вместо числа, вызовите функцию снова на под-объект. –

ответ

2

Относительно простая проблема с рекурсией, я бы использовал функцию, которая вызывает себя при обнаружении вспомогательных объектов. Я также хотел бы избежать с помощью для в цикле, и вместо того, чтобы использовать Foreach на клавишах объекта (это намного быстрее, и не требует проверки hasOwnProperty.)

function resetValuesToZero (obj) { 
 
    Object.keys(obj).forEach(function (key) { 
 
     if (typeof obj[key] === 'object') { 
 
      return resetValuesToZero(obj[key]); 
 
     } 
 
     obj[key] = 0; 
 
    }); 
 
} 
 

 
var stats = { 
 
    bookServed: { 
 
     redis: 90, 
 
     s3: 90, 
 
     signedUrl: 70 
 
    }, 
 
    errors: { 
 
     redis: { 
 
      bookService: 70, 
 
      mapi: 50, 
 
      capi: 30 
 
     }, 
 
     AWS: { 
 
      signedUrl: 70, 
 
      downloadBook: 50, 
 
      searchBook: 10 
 
     }, 
 
     decryption: 60 
 
    } 
 
}; 
 

 
console.log(stats.errors.AWS.signedUrl); // 70 
 
resetValuesToZero(stats); 
 
console.log(stats.errors.AWS.signedUrl); // 0

+0

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

Смежные вопросы