Como iterar sobre um object JavaScript?

Eu tenho um object em JavaScript:

{ abc: '...', bca: '...', zzz: '...', xxx: '...', ccc: '...', // ... } 

Eu quero usar um loop for para obter suas propriedades. E eu quero iterar em partes (nem todas as propriedades do object de uma só vez).

Com um array simples, posso fazer isso com um loop padrão:

 for (i = 0; i < 100; i++) { ... } // first part for (i = 100; i < 300; i++) { ... } // second for (i = 300; i < arr.length; i++) { ... } // last 

Mas como fazer isso com objects?

Para a maioria dos objects, use for .. in :

 for (var key in yourobject) { console.log(key, yourobject[key]); } 

Para evitar o registro de propriedades herdadas, verifique com hasOwnProperty :

 for (var key in yourobject) { if (yourobject.hasOwnProperty(key)) { console.log(key, yourobject[key]); } } 

Esta documentação do MDN explica mais geralmente como lidar com objects e suas propriedades.

Se você quiser fazer “em pedaços”, o melhor é extrair as chaves em um array. Como o pedido não é garantido, este é o caminho correto. Nos navegadores modernos, você pode usar

 var keys = Object.keys(yourobject); 

Para ser mais compatível, é melhor você fazer isso:

  var keys = []; for (var key in yourobject) { if (yourobject.hasOwnProperty(key)) keys.push(key); } 

Então você pode iterar em suas propriedades pelo índice: yourobject[keys[i]] :

 for (var i=300; i 

Aqui está outra solução de iteração para navegadores modernos:

 Object.keys(obj).filter(function(k, i) { return i >= 100 && i < 300; }).forEach(function(k) { console.log(obj[k]); }); 

Ou ainda mais curto:

 Object.keys(obj).forEach(function(k, i) { if (i >= 100 && i < 300) { console.log(obj[k]); } }); 

No entanto, você deve considerar que as propriedades no object JavaScript não estão classificadas, ou seja, não têm ordem.

Com os novos resources do ES6 / ES2015, você não precisa mais usar um object para iterar em um hash. Você pode usar um mapa . Javascript Maps mantém as chaves no pedido de inserção, o que significa que você pode iterar sobre elas sem ter que verificar o hasOwnProperty, que sempre foi realmente um hack.

Iterar sobre um mapa:

 var myMap = new Map(); myMap.set(0, "zero"); myMap.set(1, "one"); for (var [key, value] of myMap) { console.log(key + " = " + value); } // Will show 2 logs; first with "0 = zero" and second with "1 = one" for (var key of myMap.keys()) { console.log(key); } // Will show 2 logs; first with "0" and second with "1" for (var value of myMap.values()) { console.log(value); } // Will show 2 logs; first with "zero" and second with "one" for (var [key, value] of myMap.entries()) { console.log(key + " = " + value); } // Will show 2 logs; first with "0 = zero" and second with "1 = one" 

ou use forEach:

 myMap.forEach(function(value, key) { console.log(key + " = " + value); }, myMap) // Will show 2 logs; first with "0 = zero" and second with "1 = one" 

Usando Object.entries você faz algo assim.

  // array like object with random key ordering const anObj = { 100: 'a', 2: 'b', 7: 'c' }; console.log(Object.entries(anObj)); // [ ['2', 'b'],['7', 'c'],['100', 'a'] ] 

O método Object.entries () retorna uma matriz da propriedade enumerável do próprio object [key, value]

Então você pode iterar sobre o object e ter key e value para cada um dos objects e obter algo assim.

 const anObj = { 100: 'a', 2: 'b', 7: 'c' }; Object.entries(anObj).map(obj => { const key = obj[0]; const value = obj[1]; // do whatever you want with those values. }); 

ou assim

 // Or, using array extras Object.entries(obj).forEach(([key, value]) => { console.log(`${key} ${value}`); // "a 5", "b 7", "c 9" }); 

Para uma referência, dê uma olhada nos documentos MDN para Entradas de Objeto

A única maneira confiável de fazer isso seria salvar seus dados de object em duas matrizes, uma das chaves e outra para os dados:

 var keys = []; var data = []; for (var key in obj) { if (obj.hasOwnProperty(key)) { keys.push(key); data.push(obj[key]); // Not necessary, but cleaner, in my opinion. See the example below. } } 

Você pode então iterar sobre os arrays como faria normalmente:

 for(var i = 0; i < 100; i++){ console.log(keys[i], data[i]); //or console.log(keys[i], obj[keys[i]]); // harder to read, I think. } for(var i = 100; i < 300; i++){ console.log(keys[i], data[i]); } 

Eu não estou usando Object.keys(obj) , porque isso é o IE 9 +.

Se você quisesse iterar todo o object de uma só vez, você poderia usar for in loop:

 for (var i in obj) { ... } 

Mas se você quiser dividir o object em partes, na verdade você não pode. Não há garantia de que as propriedades no object estejam em qualquer ordem especificada. Portanto, posso pensar em duas soluções.

A primeira delas é “remover” propriedades já lidas:

 var i = 0; for (var key in obj) { console.log(obj[key]); delete obj[key]; if ( ++i > 300) break; } 

Outra solução que posso pensar é usar o Array of Arrays em vez do object:

 var obj = [['key1', 'value1'], ['key2', 'value2']]; 

Então, o padrão for loop funcionará.

-> se iteramos sobre um object JavaScript usando e encontramos chave de array de objects

 Object.keys(Array).forEach(key => { console.log('key',key) }) 

Você pode tentar usar o lodash – Uma biblioteca de utilitários JavaScript moderna que oferece modularidade, desempenho e extras js para iterar objects rapidamente: –

 var users =  { 'fred':     { 'user':  'fred',    'age':  40 }, 'pebbles':  { 'user':  'pebbles', 'age':  1 } }; _.mapValues(users,  function(o) { return o.age; }); // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) // The `_.property` iteratee shorthand. console.log(_.mapValues(users,  'age')); // returns age property & value console.log(_.mapValues(users,  'user')); // returns user property & value console.log(_.mapValues(users)); // returns all objects // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) 
  

Realmente um PITA isso não faz parte do Javascript padrão.

 /** * Iterates the keys and values of an object. Object.keys is used to extract the keys. * @param object The object to iterate * @param fn (value,key)=>{} */ function objectForEach(object, fn) { Object.keys(object).forEach(key => { fn(object[key],key, object) }) } 

Observação: eu mudei os parâmetros de retorno de chamada para (valor, chave) e adicionei um terceiro object para tornar a API consistente com outras APIs.

Use assim

 const o = {a:1, b:true}; objectForEach(o, (value, key, obj)=>{ // do something }); 
 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); 

Eu finalmente encontrei uma útil function utilitária com uma interface unificada para iterar Objetos, Strings, Arrays, TypedArrays, Maps, Sets, (any Iterables).

 const iterate = require('@az/iterate-it'); const obj = { a: 1, b: 2, c: 3 }; iterate(obj, (value, key) => console.log(key, value)); // a 1 // b 2 // c 3 

https://github.com/alrik/iterate-javascript