Поиск условного индекса элемента в списке объектов

#javascript

Вопрос:

Мне нужно найти индекс элемента из списка объектов. Сначала я должен проверить, существует ли этот элемент со статусом ОЖИДАНИЯ. Если элемента с таким статусом не существует, найдите что-нибудь другое с любым другим статусом. Есть ли для этого какое-нибудь лучшее решение?

x в этом коде, полученном с карты

 MainArray.map((x) =gt; {  let itemIndex = orders?.findIndex(item =gt; item.status === 'WAITING' amp;amp; item.slot=== (x));  if (itemIndex === -1) {  itemIndex = orders amp;amp; orders.findIndex(item =gt; item.slot === (x));  }  return itemIndex; }  

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

1. «лучше» в каком смысле?

2. может быть, однострочное решение 🙂 Я чувствую, что этот код не очень хорош

Ответ №1:

Разумного «однострочного решения» не будет (в любом случае они переоценены; их трудно читать, трудно отлаживать); но вы можете избежать повторного поиска по массиву с помощью for цикла:

 const indexes = MainArray.map((x) =gt; {  let bySlotIndex;  for (let index = 0, length = orders?.length; orders amp;amp; index lt; length;   index) {  const order = orders[index];  if (item.slot === x) {  bySlotIndex = bySlotIndex ?? index;  if (item.status === "WAITING") {  return index; // Found a waiting one, we're done  }  }  }  return bySlotIndex ?? -1; });  

Или , если вы действительно хотите использовать findIndex , вы можете избежать некоторых поисков, найдя первый с соответствующим slot первым:

 const indexes = MainArray.map((x) =gt; {  const bySlotIndex = orders?.findIndex(order =gt; order.slot === x) ?? -1;  if (bySlotIndex === -1) {  return -1;  }  const waitingIndex = orders.findIndex(  order =gt; order.status === 'WAITING' amp;amp; order.slot === x,  bySlotIndex // Start at the first one with a matching slot  );   return waitingIndex === -1 ? bySlotIndex : waitingIndex; });  

Обратите внимание, что оба приведенных выше возврата -1 , если orders является ложным, а не undefined . Подправьте, если вы действительно этого хотите undefined .

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

1. мне нравится решение для цикла. Также получил идею из второго кода. Спасибо

Ответ №2:

Вы можете использовать findIndex для поиска элемента со статусом, равным «ОЖИДАНИЕ». в случае, если элемент не существует, используйте findIndex для возврата первого элемента со статусом.

 const arr = [{status: "WAITING", slot : 1}, {status: "NOTWAITING", slot: 2}];  const getIndex = (arr) =gt; {  const idx = arr.findIndex(x =gt; x.status === 'WAITING');  return idx !== -1 ? idx : arr.findIndex(x =gt; x.status); }  console.log(getIndex(arr)); 

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

1. Что случилось с этим slot сравнением?

2. @T. J. Краудер — из объяснения операции кажется, что он просто хочет найти индекс на основе свойства статуса.

3. Код явно ищет item.slot === x , ничто в описании не говорит о том, что это необязательно. Ответ также изменяет все названия вещей (включая использование x для чего-то совершенно отличного от OP), не позволяет orders (как было) быть ложным, …