Поиск в массивах
В stamps лежат oak, затем elm и ещё раз oak, и на этой странице ящик остаётся того же размера, потому что ты ищешь одно значение, а не обходишь каждую ячейку.
Спроси марку
На прошлой странице forEach обошёл каждую песню, и сам вызов вернулся как undefined. Здесь ты называешь одну марку, и ящик не растёт и не сжимается.
Четыре вида ответа
Прежде чем читать число, реши, какой вид ответа тебе нужен. Потом выбери метод именно под этот вид.
📊 Что возвращает каждый поиск
| Метод | Вопрос | Что возвращается | Если нет |
|---|---|---|---|
indexOf |
ячейка первого совпадения | индекс | -1 |
lastIndexOf |
ячейка последнего совпадения | индекс | -1 |
includes |
значение лежит в ящике | true или false |
false |
find |
предмет, у которого проверка верна | сам предмет | undefined |
Номера ячеек приходят от indexOf и lastIndexOf, а includes и find номер ячейки не отдают.
Передняя марка
Спроси, в какой ячейке сидит первый oak. Жди число 0.
let stamps = ["oak", "elm", "oak"];
let slot = stamps.indexOf("oak");
console.log(slot);
В журнале 0, и задний oak в этот результат не входит.
let stamps = ["oak", "elm", "oak"];
let slot = stamps.indexOf("pine");
console.log(slot);
console.log(stamps.length);
pine вообще не клали, и в журнале -1. Длина остаётся 3, так что промах — это не удаление марки.
let stamps = ["oak", "elm", "oak"];
let slot = stamps.lastIndexOf("oak");
console.log(slot);
В журнале 2, то есть oak в конце ящика, а не марка спереди.
let stamps = ["oak", "elm", "oak"];
console.log(stamps.includes("elm"));
console.log(stamps.includes("pine"));
Для elm печатается true. Для pine печатается false. Это false — не -1.
let stamps = ["oak", "elm", "oak"];
let hit = stamps.find(function (name) {
return name === "elm";
});
console.log(hit);
let miss = stamps.find(function (name) {
return name === "pine";
});
console.log(miss);
Первая строка — это текст elm, вторая — undefined. Проверка, которую не прошла ни одна марка, не является номером ячейки.
Запиши ячейку
Преврати ячейку первого oak в текст, а если поиск дал -1, покажи в абзаце слово missing.
<!DOCTYPE html>
<html>
<head>
<title>array-search — page</title>
</head>
<body>
<p id="slot">…</p>
<script>
let stamps = ["oak", "elm", "oak"];
let slot = stamps.indexOf("oak");
let line = "missing";
if (slot !== -1) {
line = String(slot);
}
let box = document.getElementById("slot");
box.textContent = line;
</script>
</body>
</html>
Абзац показывает 0. Поменяй поиск на pine и обнови страницу. Тогда увидишь слово missing.
Поищи сам
Сделай эти шесть проверок на том же ящике.
- Запиши ячейку первого oak и жди 0
- Запиши поиск pine и жди -1, длина пусть останется 3
- Запиши ячейку последнего oak и жди 2
- Отдельно отметь, есть ли elm и есть ли pine
- Найди elm через find, найди и pine, и положи текст рядом с undefined
- Прочитай абзац, поищи pine и обнови страницу
Легко перепутать
Не склеивай эти шесть случаев.
- Не считай -1 ячейкой, которую можно прочитать
- Не читай true или false как номер ячейки
- Не жди, что find вернёт 1 для elm
- Не бери forEach, когда нужно только да или нет
- Не считай совпадением другой тип или другой регистр
- Не проверяй успех через if (slot), ведь 0 — настоящее попадание
Что унести с собой
Держи эти различия порознь.
- Первое совпадение или -1 даёт indexOf
- Последнее совпадение или -1 даёт lastIndexOf
- Да или нет даёт includes
- Саму марку или undefined даёт find
- Промах не меняет длину
- Следующая страница — про дату и время
🧠 Проверьте Свои Знания
Проверьте Свои Знания
Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху