Я пытаюсь найти индекс ячейки, который содержит два совпадения строк. Например, у меня есть имя и фамилия. Мне нужно найти ячейку, которая содержит оба этих имени.
Возможные комбинации имен могут быть следующими: Jobs, Steve
или Jobs II, Steve
или Jobs, Steve Apple
или Jobs Jr, Steve Apple
. Вы понимаете суть.
Мне нужно вернуть индекс первой совпадающей ячейки, которая содержит как имя, так и фамилию.
Вот моя попытка. Я подумал, что стоит сначала попробовать найти совпадение с фамилией, а затем проверить, содержит ли это совпадение также и имя:
var firstName="Steve";
var lastName="Jobs";
var columnOfNamesArr = ['Participants','Wozniak, Steve','Gates, Bill','Cook, Tim','Jobs, Mark','Jobs, Steve Apple','Musk, Elon'];
var lastNameIndex = columnOfNamesArr.findIndex(s => s.indexOf(lastName) >= 0);
var nameIndex = columnOfNamesArr[lastNameIndex].findIndex(s => s.indexOf(firstName) >= 0);
Однако я получаю следующую ошибку на строке, которая начинается с var firstNameIndex
…
TypeError: Невозможно прочитать свойства неопределенного (чтение 'indexOf')
Что я делаю не так и есть ли способ сделать это всё в одном поиске вместо двух?
В вашем скрипте columnOfNamesArr[lastNameIndex]
является строковым значением. Когда вы хотите использовать findIndex
, необходимо использовать массив. Я думаю, это причина вашей текущей проблемы. Если вы хотите получить первый индекс массива columnOfNamesArr
, когда оба firstName
и lastName
включены, как насчет следующего изменения?
Измененный скрипт:
var firstName="Steve";
var lastName="Jobs";
var columnOfNamesArr = ['Participants', 'Wozniak, Steve', 'Gates, Bill', 'Cook, Tim', 'Jobs, Mark', 'Jobs, Steve Apple', 'Musk, Elon'];
// var index = columnOfNamesArr.findIndex(s => s.indexOf(lastName) >= 0 && s.indexOf(firstName) >= 0);
var index = columnOfNamesArr.findIndex(s => s.includes(lastName) && s.includes(firstName));
console.log(index);
console.log({ value: columnOfNamesArr[index] });
Когда этот скрипт выполняется, в лог выводится 5
.
Примечание:
-
Если оба
firstName
иlastName
включены в вводимый массив, и вы хотите получить индексы в виде массива, как насчет следующего изменения?var firstName="Steve"; var lastName="Jobs"; var columnOfNamesArr = ['Participants', 'Wozniak, Steve', 'Gates, Bill', 'Cook, Tim', 'Jobs, Mark', 'Jobs, Steve Apple', 'Musk, Elon']; var res = columnOfNamesArr.reduce((ar, s, i) => { if (s.includes(lastName) && s.includes(firstName)) { ar.push(i); } return ar; }, []); console.log(res);
Справка:
Ответ
Вот полное решение вашей задачи на языке JavaScript, которое возвращает индекс первой ячейки, содержащей как имя, так и фамилию. Мы будем использовать метод findIndex
, чтобы упростить поиск и избежать необходимости делать несколько обходов массива:
var firstName = "Steve";
var lastName = "Jobs";
var columnOfNamesArr = ['Participants', 'Wozniak, Steve', 'Gates, Bill', 'Cook, Tim', 'Jobs, Mark', 'Jobs, Steve Apple', 'Musk, Elon'];
var index = columnOfNamesArr.findIndex(s => s.includes(lastName) && s.includes(firstName));
console.log(index); // Выводит индекс, если нашлась соответствующая ячейка
console.log({ value: columnOfNamesArr[index] }); // Объект с найденным значением
Объяснение:
-
Определение имени и фамилии: Мы задаем переменные
firstName
иlastName
с именем и фамилией, которые мы ищем. -
Массив имен: Определяем массив
columnOfNamesArr
, который содержит строки с именами сотрудников. -
Поиск индекса: Используем метод
findIndex
, который перебирает элементы массива и возвращает индекс первого элемента, удовлетворяющего условию. В условии мы проверяем с помощью методаincludes
, содержится лиlastName
иfirstName
в строке. - Вывод результата: Если найден индекс, он будет выведен в консоль. Также выводится значение соответствующей ячейки для наглядности.
Альтернативное решение:
Если вы хотите получить все индексы ячеек, которые содержат обе строки, вы можете использовать метод reduce
:
var firstName = "Steve";
var lastName = "Jobs";
var columnOfNamesArr = ['Participants', 'Wozniak, Steve', 'Gates, Bill', 'Cook, Tim', 'Jobs, Mark', 'Jobs, Steve Apple', 'Musk, Elon'];
var res = columnOfNamesArr.reduce((ar, s, i) => {
if (s.includes(lastName) && s.includes(firstName)) {
ar.push(i);
}
return ar;
}, []);
console.log(res); // Выводит массив индексов всех соответствующих ячеек
Объяснение альтернатива:
- Используя
reduce
, мы проходим по каждому элементуcolumnOfNamesArr
. - Если строка содержит как
lastName
, так иfirstName
, мы добавляем индекс этой строки в результирующий массивar
. - В конце выводим этот массив, чтобы увидеть все подходящие индексы.
Рекомендуемые ресурсы:
Теперь вы можете использовать приведенное решение в своей программе для поиска индекса ячейки с именем и фамилией!