Как перебирать объект 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
Но как это сделать с объектами?
Ответы
Ответ 1
Для большинства объектов используйте for.. in
:
for (var key in yourobject) {
console.log(key, yourobject[key]);
}
С ES6, если вам нужны одновременно ключи и значения, выполните
for (let [key, value] of Object.entries(yourobject)) {
console.log(key, value);
}
Чтобы избежать регистрации унаследованных свойств, проверьте с помощью hasOwnProperty:
for (var key in yourobject) {
if (yourobject.hasOwnProperty(key)) {
console.log(key, yourobject[key]);
}
}
Вам не нужно проверять hasOwnProperty
при итерации ключей, если вы используете простой объект (например, тот, который вы сделали сами с помощью {}
).
В этой документации 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<keys.length && i<600; i++) {
console.log(keys[i], yourobject[keys[i]]);
}
Ответ 2
Вот еще одно итерационное решение для современных браузеров:
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 не сортируются, т.е. не имеют порядка.
Ответ 3
Используя 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 для записей объектов
Ответ 4
С новыми функциями ES6/ES2015 вам больше не нужно использовать объект для перебора хэша. Вы можете использовать Map. Карты 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"
Ответ 5
Единственный надежный способ сделать это - сохранить данные вашего объекта в 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+.
Ответ 6
Если вам нужен ключ и значение при итерации, вы можете использовать цикл for... of с Object.entries.
const myObj = {a: 1, b: 2}
for (let [key, value] of Object.entries(myObj)) {
console.log('key=${key} value=${value}')
}
// output:
// key=a value=1
// key=b value=2
Ответ 7
-> если мы перебираем объект JavaScript, используя и находим ключ массива объектов
Object.keys(Array).forEach(key => {
console.log('key',key)
})
Ответ 8
Если вы хотите итерировать весь объект сразу, вы можете использовать цикл 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']];
Затем будет работать стандартный цикл for
.
Ответ 9
Я наконец-то придумал удобную служебную функцию с унифицированным интерфейсом для итерации объектов, строк, массивов, TypedArrays, карт, наборов (любых итерируемых элементов).
const iterate = require('@a-z/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
Ответ 10
Вы можете попробовать использовать lodash- современную библиотеку утилит JavaScript, предоставляющую модульность, производительность и дополнительные возможности для быстрой итерации объекта: -
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)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash-compat/3.10.2/lodash.js"></script>
Ответ 11
На самом деле 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
});
Ответ 12
Для итерации объекта мы обычно используем цикл for..in
. Эта структура будет перебирать все перечисляемые свойства, включая те, которые наследуются через наследование прототипа. Например:
let obj = {
prop1: '1',
prop2: '2'
}
for(let el in obj) {
console.log(el);
console.log(obj[el]);
}
Ответ 13
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);
Ответ 14
Да. Вы можете перебрать объект, используя цикл for. Вот пример
var myObj = {
abc: 'ABC',
bca: 'BCA',
zzz: 'ZZZ',
xxx: 'XXX',
ccc: 'CCC',
}
var k = Object.keys (myObj);
for (var i = 0; i < k.length; i++) {
console.log (k[i] + ": " + myObj[k[i]]);
}
Ответ 15
В ES6 вам нужны и ключи, и значения одновременно, пожалуйста, сделайте это.
for (let [key, value] of Object.entries(your_object)) {
console.log(key, value);
}
Ответ 16
const o = {
name: "Max",
location: "London"
};
for (const [key, value] of Object.entries(o)) {
console.log('${key}: ${value}');
}
Попробуйте онлайн