Проверьте, если в конце цикла for / in - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть цикл for / in, который я хотел бы знать, если я в конце.Я не совсем уверен, как это будет работать?

Мой код:

for (const key in posts.val()) {
    if(posts.val()[key][postId] != undefined) {
        found = true;
        //do something
    } else {
         // if at end && found !== true
      }
 }

Любая идея, как бы я узнал, если я в концецикл for / in?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Для чего-то подобного нет встроенной функциональности.Предполагая, что свойства не видоизменяются при вызове .val(), вы могли бы вызвать .val() первоначально для получения объекта, подсчитать количество ключей (включая унаследованные ключи) с помощью for..in, изатем используйте for..in снова , чтобы выполнить итерацию и проверить, насколько вы близки к концу цикла:

const val = posts.val();
let totalKeyCount = 0;
for (const _ in posts.val()) {
  totalKeyCount++;
}
let keyIndex = 0;
for (const key in posts.val()) {
  keyIndex++;
  if(val[key][postId] != undefined) {
    found = true;
    //do something
  } else {
    if (keyIndex === totalKeyCount) {
      console.log('last iteration');
    }
  }
}

Но, если вы не зависит от унаследованных ключей, было бы лучше использовать Object.keys, который возвращает массив и какие методы массива можно использовать.

Предполагаявы пытаетесь найти определенное значение в объекте (и в самом объекте), вместо этого вы можете использовать .find для Object.values:

const foundPost = Object.values(posts.val()).find(item => item[postId] !== undefined);
// if an item[postId], if it exists, will be truthy, simplify to `item => item[postId]`
if (foundPost) {
  // do something with the found post
} else {
  // all iterations have been completed, and nothing was found
}

Также обратите внимание, что порядок свойств повторяется дляв цикле for..in не полностью надежен.Как MDN говорит:

Цикл for ... in перебирает свойства объекта в произвольном порядке (подробнее об операторе delete смотрите, почему нельзя зависеть откажущаяся упорядоченность итерации, по крайней мере, в настройках кросс-браузера).

0 голосов
/ 15 сентября 2018

Нет реального понятия конца объекта, если вы не имеете в виду последний ключ для итерации.Вы можете получить ключи объекта, выполнить итерацию и проверить индекс по keys.length-1:

let obj = posts.val();

Object.keys(obj).forEach((k, i, keys) => {
    if(obj[k][postId] !== undefined) {
        let found = true;
        //do something
    } else {
        let atEnd = (i === keys.length-1);
        // if at end && found !== true
    }
});

Как правило, поиск чего-то выглядит следующим образом:

function isFound(obj, cmpFn) {
    let found = false;
    for (let k in obj) {
        if (cmpFn(obj[k]) === true) {
            found = true;
            break;
        }
    }
    return found;
}

Или:

function isFound(obj, cmpFn) {
    return Object.keys(obj)
                 .some(k => cmpFn(obj[k]));
}

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

let isFound = (id_b in obj[id_a]);

Вышеприведенное работает, если вы не храните пустые записи в таблице, что обычно желательно.

Я бы также рекомендовал использовать !== вместо !=, чтобы избежать принуждения и двусмысленности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...