«» в строке.map(функция(){вернуть $(this).val();}).get()

#javascript #arrays

#javascript #массивы

Вопрос:

Я проверяю, есть ли какое-либо «» значение в массиве элементов, подобном этому

 "" in line.map(function(){return $(this).val();}).get()
  

и он возвращает false, но когда я отлаживаю его в браузере, я получаю это в массиве

 line.map(function(){return $(this).val();}).get() = ["1", "2", "4", "", "", "", "", "", "3"]
  

я полагаю, что это должно возвращать true, верно?

я уже пробовал с .each , но я не могу вернуть его, если я не использую глобальную переменную с return false;

Ответ №1:

in Оператор не проверяет, содержит ли массив значение (которое было бы indexOf или includes ), он перечисляет свойства объекта. Например:

 const data = ['a', 'b', 'c', 'd', 'e', 'f'];

for (f in data) {
  console.log('gets the index:', f);
  console.log('gets the value:', data[f]); // <- note the access using f
}  

Скорее, вы должны использовать, find если вам нужен элемент или some если вам просто нужно проверить наличие:

 const data = ['a', 'b', 'c', 'd', 'e', 'f'];

console.log('find an element by value:', data.find(it => it === 'c'));
console.log('check if any elements match:', data.some(it => it === 'c'));  

Комментарии:

1. отличная идея, кстати, что означает it => это ?

2. @JoelRodrigues это сокращение для функции lambda (или жирной стрелки). Это анонимные функции, которые обычно представляют собой одно выражение, идеально подходящее для предикатов в find и друзьях.

Ответ №2:

Вы должны использовать фильтр и проверять длину

 var hasEmpty = line.filter(function(){ return $(this).val().trim() === ""}).length > 0;
  

или немного больше ES2015, используя Array.some для коллекции jQuery

 var hasEmpty = line.toArray().some((el) => $(el).val() === "");
  

Комментарии:

1. Если производительность имеет значение ( если ), я бы не решился использовать filter в качестве замены для some , поскольку он не может прерваться раньше, чем for цикл. Это также касается очень больших массивов. Это будет работать и обычно работает хорошо, но они не полностью эквивалентны.

2. @ssube — нет, они не совпадают, но для набора элементов это не должно иметь значения, если, конечно, в OP нет миллионов элементов?