#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
(как было) быть ложным, …