Sprawdź, czy tablica jest pusta czy null

107

Chciałbym wiedzieć, jak sprawdzić, czy tablica jest pusta lub zerowa w jQuery. Próbowałem, array.length === 0ale to nie zadziałało. Nie zgłosił też żadnego błędu.

To jest kod:

var album_text = new Array();

$("input[name='album_text[]']").each(function(){
  if( $(this).val() &&  $(this).val() != '') {
    album_text.push($(this).val());
  }
});
if (album_text.length === 0) {
  $('#error_message').html("Error");
}

else {
  // send data
}
Wejście
źródło
2
Tak samo jak w „normalnym JavaScript”: stackoverflow.com/questions/2672380/…
Julien Schmidt
1
@Julien, wypróbowałem wszystkie rozwiązania wymienione w tym wątku przed rozpoczęciem tego wątku. Żaden z nich jakoś nie działał.
wejście
Czy możemy uzyskać więcej kodu kontekstowego? Otaczający JavaScript, HTML? Czy na pewno $("input[name='album_text[]']")zwraca elementy?
Jon Adams,
@JulienSchmidt: pytanie, z którym łączysz się, dotyczy sprawdzenia, czy wartość tablicy jest pusta, a nie cała tablica.
Dan Dascalescu

Odpowiedzi:

168

Dopóki twój selektor faktycznie działa, nie widzę nic złego w twoim kodzie, który sprawdza długość tablicy. To powinno zrobić, co chcesz. Istnieje wiele sposobów na uporządkowanie kodu, aby był prostszy i bardziej czytelny. Oto poprawiona wersja z notatkami o tym, co wyczyściłem.

var album_text = [];

$("input[name='album_text[]']").each(function() {
    var value = $(this).val();
    if (value) {
        album_text.push(value);
    }
});
if (album_text.length === 0) {
    $('#error_message').html("Error");
}

else {
  //send data
}

Kilka uwag o tym, co robiłeś i co zmieniłem.

  1. $(this)jest zawsze prawidłowym obiektem jQuery, więc nie ma powodu, aby kiedykolwiek go sprawdzać if ($(this)). Może nie mieć w sobie żadnych obiektów DOM, ale możesz to sprawdzić, $(this).lengthjeśli potrzebujesz, ale nie jest to konieczne, ponieważ .each()pętla nie działałaby, gdyby nie było żadnych elementów, więc $(this)wewnątrz .each()pętli zawsze będzie coś.
  2. Wielokrotne użycie znaku $ (this) w tej samej funkcji jest nieefektywne. Znacznie lepiej jest umieścić go raz w zmiennej lokalnej, a następnie użyć z tej zmiennej lokalnej.
  3. Zaleca się inicjowanie tablic za pomocą []zamiast new Array().
  4. if (value)gdy oczekuje się, że wartość będzie ciągiem znaków, będzie zarówno chroniona value == null, jak value == undefinedi value == ""nie musisz tego robić if (value && (value != "")). Możesz po prostu zrobić: if (value)sprawdzić wszystkie trzy puste warunki.
  5. if (album_text.length === 0) powie ci, czy tablica jest pusta, o ile jest poprawną, zainicjowaną tablicą (która jest tutaj).

Co próbujesz zrobić z tym selektorem $("input[name='album_text[]']")?

jfriend00
źródło
5
@MaciekSemik - patrz stackoverflow.com/questions/359494/… . Zawsze używam ścisłej równości ( ===), chyba że specjalnie chcę zezwolić na konwersję typu. To dobry nawyk.
jfriend00
73

JQuery użytkownika jest EmptyObject, aby sprawdzić, czy tablica zawiera elementy, czy nie.

var testArray=[1,2,3,4,5];
var testArray1=[];
console.log(jQuery.isEmptyObject(testArray)); //false
console.log(jQuery.isEmptyObject(testArray1)); //true
Mayank Raipure
źródło
2
O wiele bardziej wiarygodne niż sprawdzanie długości, zwłaszcza jeśli zmienna może być również obiektem (w przypadku obiektów długość nie sprawdza się, jeśli jest pusta).
hałaśliwy
Moim zdaniem jest to bardziej odpowiednia odpowiedź.
Ear3s
4
isEmptyObjectzawsze zwraca falseif Array.prototypejest rozszerzony, np. Array.prototype.someFunction = function () {};- nawet jeśli tablica jest pusta. Zauważ, że niektóre frameworki (np. Ember.js) domyślnie rozszerzają prototyp Array.
jesenko
4
Uważaj z isEmptyObject! Dla jQuery 1.8.3 jQuery.isEmptyObject([])zwraca false, ale dla jQuery 1.11.3 zwraca true. W rzeczywistości dokumentacja jQuery mówi, że argument powinien zawsze być zwykłym obiektem JavaScript, ponieważ inne typy obiektów (elementy DOM, prymitywne łańcuchy / liczby, obiekty hosta) mogą nie dawać spójnych wyników we wszystkich przeglądarkach. Przepraszamy, nie widziałem odpowiedzi @rhinoxi.
Dmitry Vershinin
8

Powinieneś sprawdzić ''(pusty ciąg) przed wypchnięciem do swojej tablicy. Twoja tablica zawiera elementy, które są pustymi ciągami. Wtedy twoja album_text.length === 0wola będzie działać dobrze.

Daniel A. White
źródło
Zobacz zaktualizowany kod. Dodałem ten kod, if( $(this).val() && $(this).val() != '') ale nie działa.
wejście
8

Myślę, że używanie $ .isEmptyObject z jquery do sprawdzenia, czy tablica jest pusta, jest niebezpieczne, jak wspomniał @jesenko. Właśnie spotkałem się z tym problemem.

W dokumencie isEmptyObject wspomina się o:

Argument powinien zawsze być zwykłym obiektem JavaScript

które możesz określić za pomocą $.isPlainObject. Zwrot $.isPlainObject([])jest fałszywy.

rhinoxi
źródło