Найти с предикатом, начинающимся с индекса - PullRequest
1 голос
/ 13 января 2020

Каков наилучший способ найти элемент массива (не обязательно индекс, но это работает), который соответствует предикату (поэтому я не могу напрямую сравнивать элементы, забудьте indexOf) , начиная с an index.

Я хочу получить «следующий соответствующий» элемент из массива, начиная с текущей позиции.

Ниже приведена моя текущая реализация:

var currentIndex = 1;

var results = [
  {status: 'AWAITING_APPROVAL'}, // Not matched
  {status: 'APPROVED'},
  {status: 'APPROVED'},
  {status: 'APPROVED'},
  {status: 'AWAITING_APPROVAL'},
  {status: 'APPROVED'},
];

var nextIndex = results
  .slice(currentIndex)
  .findIndex(function (content) {
    return content.status === 'AWAITING_APPROVAL';
  });

if (nextIndex !== -1) {
  nextIndex += currentIndex;
  // Here we can use nextIndex which is 4
  console.log(nextIndex);
}

Конечно, я мог бы просто сделать основание c для l oop / ifs, но мне интересно, есть ли лучший способ (возможно, используя loda sh).

Ответы [ 2 ]

5 голосов
/ 13 января 2020

Вы можете добавить проверку для большего индекса.

var currentIndex = 1,
    results = [{ status: 'AWAITING_APPROVAL'}, { status: 'APPROVED'}, { status: 'APPROVED'}, { status: 'APPROVED'}, { status: 'AWAITING_APPROVAL'}, { status: 'APPROVED'}],
    nextIndex = results.findIndex(({ status }, i) => i > currentIndex && status === 'AWAITING_APPROVAL');

console.log(nextIndex);
0 голосов
/ 13 января 2020

Для справки, вот наивно для / если версия

var currentIndex = 1;

var results = [
  {status: 'AWAITING_APPROVAL'}, // Not matched
  {status: 'APPROVED'},
  {status: 'APPROVED'},
  {status: 'APPROVED'},
  {status: 'AWAITING_APPROVAL'},
  {status: 'APPROVED'},
];

var nextIndex;
for (nextIndex = currentIndex; nextIndex <= results.length; nextIndex++) {
  if (nextIndex === results.length) {
    nextIndex = -1;
    break;
  }
  if (results[nextIndex].status === 'AWAITING_APPROVAL') {
    break;
  }
}

console.log(nextIndex);
...