Как перебирать объект JavaScript?

У меня есть объект в JavaScript:

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

Я хочу использовать цикл for для получения его свойств. И я хочу повторить его по частям (не все свойства объекта сразу).

С помощью простого массива я могу сделать это со стандартом for цикла:

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

Но как это сделать с объектами?

Для большинства объектов используйте for .. in :

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

Чтобы избежать регистрации унаследованных свойств, проверьте с помощью hasOwnProperty :

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

В этой документации MDN более подробно объясняется, как обращаться с объектами и их свойствами.

Если вы хотите сделать это «в кусках», лучше всего извлечь ключи из массива. Поскольку заказ не гарантируется, это правильный путь. В современных браузерах вы можете использовать

 var keys = Object.keys(yourobject); 

Чтобы быть более совместимым, вам лучше сделать это:

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

Затем вы можете перебирать свои свойства по индексу: yourobject[keys[i]] :

 for (var i=300; i 

Вот еще одно итерационное решение для современных браузеров:

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

Или даже короче:

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

Однако вы должны учитывать, что свойства в объекте JavaScript не сортируются, т. Е. Не имеют порядка.

С новыми функциями ES6 / ES2015 вам больше не нужно использовать объект для перебора hashа. Вы можете использовать карту . Карты Javascript сохраняют ключи в порядке ввода, то есть вы можете перебирать их без необходимости проверять hasOwnProperty, который всегда был взломан.

Итерации по карте:

 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" 

или использовать для каждого:

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

Используя Object.entries вы делаете что-то вроде этого.

  // 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'] ] 

Метод Object.entries () возвращает массив собственного перечислимого свойства данного объекта [ключ, значение]

Таким образом, вы можете перебирать объект и иметь key и value для каждого объекта и получить что-то вроде этого.

 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. }); 

или как это

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

Для справки смотрите документы MDN для записей объектов

Единственный надежный способ сделать это – сохранить ваши данные объекта в 2 массивах, один из ключей и один для данных:

 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. } } 

Затем вы можете перебирать массивы, как обычно:

 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]); } 

Я не использую Object.keys(obj) , потому что это IE 9+.

Если вы хотите итерировать весь объект сразу, вы можете использовать for in цикла:

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

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

Первым из них является «удалить» уже прочитанные свойства:

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

Другое решение, о котором я думаю, это использовать массив массивов вместо объекта:

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

Затем будет работать стандартный цикл.

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

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

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

 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) 
  

На самом деле PITA это не часть стандартного Javascript.

 /** * 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) }) } 

Примечание. Я переключил параметры обратного вызова на (значение, ключ) и добавил третий объект, чтобы сделать API совместимым с другими API.

Используйте его так

 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); 

Наконец, я придумал удобную функцию утилиты с унифицированным интерфейсом для итерации объектов, строк, массивов, типизированных массивов, карт, наборов (любые итерации).

 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

Interesting Posts

Насколько уникален UUID?

XMLHttpRequest не может загрузить URL-адрес с помощью jQuery

Где можно быстро найти, какое максимальное разрешение поддерживает видеокарта?

не реализуя все методы интерфейса. Является ли это возможным?

Как отправить java.util.logging в log4j?

размер блока данных в HDFS, почему 64 МБ?

Почему некоторые функции в не входят в пространство имен std?

Резюме прерванной копии файла Mac OS X

Преобразование с плавающей запятой 32-бит в 16 бит

Передача данных растровых изображений Android в действии с использованием Intent в Android

Как загрузить файл с помощью библиотеки Volley в android?

Как получить список всего программного обеспечения, которое запускается автоматически при запуске Windows 7?

Почему я получаю ошибку «не могу назначить» при установке значения для структуры как значения на карте?

React.js – Синтаксическая ошибка: это зарезервированное слово в функции render ()

Какая IDE для Scala 2.8?

Давайте будем гением компьютера.