Как передать функцию только после того, как весь массив был прочитан, а не для каждого элемента? - PullRequest
0 голосов
/ 09 сентября 2018

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

Я пытаюсь сказать следующее:

data.forEach(movie => {
    // Log each movie's title
    //console.log(movie.title);

    // Check if the userWord matches
    if (movie.title.toUpperCase().includes(userWord.toUpperCase())) {
        alert("YES");                   
    } else {
        alert("NO").
    }
});

Допустим, мой массив: array = ["Aa", "Ba", "Ca", "Da"];

Если пользователь вводит: a , то сценарий будет alert("YES") четыре раза, и я хочу, чтобы он предупреждал об этом только один раз, в конце итерации.

Для того же примера, если пользователь введет: B , тогда сценарий сначала будет alert("NO") один раз, затем alert("YES"), затем alert("YES") 2 раза, и я хочу сделать это просто alert("YES") один раз, в конце.

Наконец, если пользователь введет: Ferrari , то сценарий будет alert("NO") четыре раза, и я просто хочу, чтобы alert("NO") в конце.

Я попытался прояснить это здесь, поэтому три "случая" происходящего.

В конце я хочу знать, существует ли метод, который является своего рода противоположностью forEach или обычным for. То, что просто выполняет функцию после чтения всего массива.

Ответы [ 4 ]

0 голосов
/ 09 сентября 2018

Если я правильно понимаю вопрос, я считаю, что вы хотите выполнить что-то, если предикат соответствует хотя бы одному из элементов в массиве (поправьте меня, если я ошибаюсь). Для этого вы можете использовать метод some следующим образом:

if (movies.some((movie) => movie.toUpperCase().includes(userWord.toUpperCase()))) {
  alert('YES');
} else {
  alert('NO');
}
0 голосов
/ 09 сентября 2018

Вы можете использовать функцию массива filter, чтобы отфильтровать элементы массива, соответствующие вашим критериям, и, наконец, предупредить, только если совпадение найдено. Используя этот метод, вы можете получить все элементы, которые соответствуют вашему userWord. То есть массив match будет содержать все возможные совпадения.

var data = ['Aa', 'Bb', 'Cc', 'Dd'];
var flag = false;
var userWord = 'F'
var match = data.filter(movie => movie.indexOf(userWord) !== -1);
if(match.length)
console.log('YES');
else
console.log('NO');
0 голосов
/ 09 сентября 2018
  1. Изменить предупреждение на переменную bool
  2. Удалить другое (будет перезаписано только любое совпадение)
  3. если оператор bool вне цикла для выполнения действий

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

см. Ниже:

Метод без петель:

data = ["test","hello", "hello1"];
search = "lo"; 
const matches = data.filter(movie => movie.includes(search));

alert(matches) //array of only matches - only has hello and hello 1

Я не знаю, есть ли прирост производительности по сравнению с циклом ... Полагаю, вы могли бы провести параллельное сравнение для большого набора данных

Метод петли:

var matches = "";
data.forEach(movie => {
    // Check if the userWord matches
    if (movie.title.toUpperCase().includes(userWord.toUpperCase())) {
        matches += movie.title + "<br> ";
    }
});

if (matches.length > 0)
{
    document.getElementById("results").innerHTML = matches;
} else {
    alert("No match found");
}

Вы увидите больше настроек в первом цикле, но я думаю, что сначала нужно отфильтровать данные.

0 голосов
/ 09 сентября 2018

Я думаю, что самое близкое, что вы можете получить, это немного . Вот пример

let data = ["test","hello", "hello1"];
let userWord = "el";
let res =  data.some(movie => movie.toUpperCase().includes(userWord.toUpperCase()));
console.log(res) // prints true- means there was at least one "match", so you can alert
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...