Цикл по объекту, начинающемуся с индекса

#javascript

#javascript

Вопрос:

У меня есть объект, представляющий собой список комнат чата, где ключами являются имена комнат чата, а значением является ссылка на комнату чата. Я хочу доставлять комнаты пользователям по 50 комнат за раз. Но я не понимаю, как это можно сделать с объектом.

Предположим, вы хотите выполнить цикл по

 var obj = {
   "a" : 1,
   "b" : 2.
   "c" : 3
}
  

Но начинайте с «b», в итоге будут доступны только «b» и «c». Можно ли это сделать, в том числе с использованием какой-либо карты или таблицы?

Комментарии:

1. Вы можете использовать массив типа var include = ['b', 'c'] или var exclude = ['a'] и перебирать массив и получать значение этого ключа из obj .

2. Object.keys() plus .slice() ?

3. Что происходит между каждым «временем»? Вы предоставляете номера в какой-то асинхронной функции? Некоторый контекст поможет нам разработать решение, подходящее для вашей программы, поскольку существует несколько способов сделать это

Ответ №1:

Вы не должны полагаться на сортируемые ключи объектов. Хотя большинство браузеров (если не все) сохраняют их отсортированными.

Итак, если вы хотите доверять браузерам, вы можете добавить переменную counter и начать делать что-то после того, как счетчик достигнет того, что вы хотите. Вы можете получить длину вашего объекта, используя Object.keys() (возвращает массив) . Смешивая оба, вы можете сделать это:

 var object = {
    a: 1,
    b: 2,
    c: 3
};

var keys = Object.keys(object);
var counter;

for (counter = 0; counter < keys.length; counter  ) {
    if (counter < 1) continue; // Skip until the second element
    console.log(object[keys[counter]]);
}
  

Если вы не знаете позицию ключа заранее, вы можете добавить переменную флага и активировать ее при достижении нужного ключа, например:

 var keys = Object.keys(object);
var counter;
var start = false;

for (counter = 0; counter < keys.length; counter  ) {
    if (keys[counter] === 'b') start = true;
    if (!start) continue;
    console.log(object[keys[counter]]);
}
  

Комментарии:

1. Вы всегда можете .sort() это сделать, просто чтобы быть уверенным.

2. Хорошая идея. Но .sort() не будет работать, если он просто повторяет объект. Итак, я добавил другой метод (с использованием флага), который будет работать.

3. Да, я хотел убедиться, что массив ключей отсортирован.

Ответ №2:

Пожалуйста, смотрите Сообщение MDN о for...in цикле:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for…in

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

Ответ №3:

попробуйте этот способ

 var obj = {
   'a' : 1,
   'b' : 2.
   'c' : 3
};
var ignoreItems = ['a'];

for (var key in obj) {
  if (ignoreItems.indexOf(key) === -1) {
    // ADD YOUR CODE HERE
  }
}