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
}

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[]']")?


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

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.