Возврат индекса ячейки, содержащей совпадение двух строк

Вопросы и ответы

Я пытаюсь найти индекс ячейки, который содержит два совпадения строк. Например, у меня есть имя и фамилия. Мне нужно найти ячейку, которая содержит оба этих имени.

Возможные комбинации имен могут быть следующими: 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] }); // Объект с найденным значением

Объяснение:

  1. Определение имени и фамилии: Мы задаем переменные firstName и lastName с именем и фамилией, которые мы ищем.

  2. Массив имен: Определяем массив columnOfNamesArr, который содержит строки с именами сотрудников.

  3. Поиск индекса: Используем метод findIndex, который перебирает элементы массива и возвращает индекс первого элемента, удовлетворяющего условию. В условии мы проверяем с помощью метода includes, содержится ли lastName и firstName в строке.

  4. Вывод результата: Если найден индекс, он будет выведен в консоль. Также выводится значение соответствующей ячейки для наглядности.

Альтернативное решение:

Если вы хотите получить все индексы ячеек, которые содержат обе строки, вы можете использовать метод 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.
  • В конце выводим этот массив, чтобы увидеть все подходящие индексы.

Рекомендуемые ресурсы:

Теперь вы можете использовать приведенное решение в своей программе для поиска индекса ячейки с именем и фамилией!

Оцените материал
Добавить комментарий

Капча загружается...