Для цикла, работающего только для первого элемента

Я использую приведенный ниже код, чтобы проверить, соответствует ли входное значение какому-либо значению столбца листа Google.

Средство ведения журнала возвращает массив всех телефонных номеров в указанном столбце, но цикл for работает только для первого номера телефона в массиве. А также буду признателен, если подскажете, как добиться тех же результатов с помощью if (allNumbers.flat().indexOf(newPhone) != -1) и какой способ лучше.

function phoneSearch(newPhone) {
  try {
    var ss = SpreadsheetApp.openByUrl("URL");
    var sheet = ss.getSheetByName("sheet name");
    var allNumbers = sheet.getRange(2, 2, sheet.getLastRow() - 1, 1).getDisplayValues();
    Logger.log(allNumbers.length);

    for (var i = 0; i < allNumbers.length; i++) {
      if (allNumbers[i][0] == newPhone) {
        var result = "not available"
      } else {
        var result = "available"
      };
      return result;
    }
  } catch (e) {}
}

вам return result; - что завершает цикл - вам следует отформатировать свой код, тогда его будет легко обнаружить

Jaromanda X 19.08.2024 11:19

Потому что со стороны клиента я использую обработчик onsuccess: function onSuccess(result) { if (result == "not available") { Do something } else { Do something } } поэтому мне нужно вернуть результат цикла for на стороне сервера, чтобы завершить действие на стороне клиента. Спасибо @Jaromanda X

Mahmoud 19.08.2024 11:30

да, но ваш код всегда возвращает значение из цикла for, поэтому вы не выполняете цикл более одного раза - никогда - это то, что делает return, он возвращает значение из функции

Jaromanda X 19.08.2024 11:32

Да, я понял проблему, но не могу найти другого способа получить то, что хочу. Я пытался сгладить массив и использовать индекс, но тоже безуспешно. Любые идеи, буду очень благодарен

Mahmoud 19.08.2024 11:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваша функция всегда возвращает результат с первой итерации цикла. Возвращать следует только в том случае, если номер занят, а если нет, продолжайте проверять другие номера.

function phoneSearch(newPhone){
    try {
        var ss = SpreadsheetApp.openByUrl("URL");
        var sheet = ss.getSheetByName("sheet name");
        var allNumbers = sheet.getRange(2,2,sheet.getLastRow() -1,1).getDisplayValues();
        Logger.log(allNumbers.length);
    
        for (var i = 0; i < allNumbers.length; i++) {
            if (allNumbers[i][0] == newPhone) {
                return "not available"
            }
         }
        
         // If "not available" wasn't returned from the loop, the number is avialable
         return "available";
    } catch(e) {
         // Probably need some more robust treatment here
    }
}

большое спасибо. Теперь я понимаю, почему цикл for остановился на первом элементе.

Mahmoud 19.08.2024 11:58

Другие на этой странице объяснили, что ваш цикл возвращается после одной итерации.

Array.flat — полезный способ делать то, что вы хотите.

Это так же просто, как

function phoneSearch(newPhone) {
  try {
    var ss = SpreadsheetApp.openByUrl("URL");
    var sheet = ss.getSheetByName("sheet name");
    var allNumbers = sheet.getRange(2, 2, sheet.getLastRow() - 1, 1).getDisplayValues();
    return allNumbers.flat().includes(newNumber) ? 'not available' : 'available';
  } catch (e) {}
}

Если вас беспокоит время выполнения, вам действительно следует кэшировать значения, возвращаемые с листа.

window.addEventListener('load', () => {
  let allNumbers = []; 
  try { // store the list once
    var ss = SpreadsheetApp.openByUrl("URL");
    var sheet = ss.getSheetByName("sheet name");
    allNumbers = sheet.getRange(2, 2, sheet.getLastRow() - 1, 1).getDisplayValues();
    allNumbers = allNumbers.flat();
  } catch (e) {}

  const numberAvailable = (newPhone) => !allNumbers.includes(newNumber);

  const addNumber = (newPhone) {
    if (numberAvailable(newPhone)) {
      allNumbers.push(newPhone); // update the list used by testing availability
      // write allNumbers to sheet or add newNumber
    } else {
      console.info('Number not available'); // handle existing number
    }
  };
});

Большое спасибо. Считаете ли вы, что в этом случае сглаживание массива лучше, чем цикл, с точки зрения времени выполнения?

Mahmoud 19.08.2024 11:59

Зависит от размера. Посмотреть обновление

mplungjan 19.08.2024 12:08

Теперь все ясно. Я не знаю, что сказать, спасибо большое!

Mahmoud 19.08.2024 12:12

Пожалуйста.

mplungjan 19.08.2024 12:14

Другие вопросы по теме