Nie działa javascript Array Concat. Czemu?

97

Stworzyłem więc ten widget jqueryui. Tworzy div, do którego mogę przesyłać błędy. Kod widżetu wygląda następująco:

$.widget('ui.miniErrorLog', {
   logStart: "<ul>",   // these next 4 elements are actually a bunch more complicated.
   logEnd:   "</ul>",
   errStart: "<li>",
   errEnd:   "</li>",
   content:  "",
   refs:     [],

   _create: function() { $(this.element).addClass( "ui-state-error" ).hide(); },

   clear: function() { 
      this.content = ""; 
      for ( var i in this.refs )
         $( this.refs[i] ).removeClass( "ui-state-error" );
      this.refs = [];
      $(this.element).empty().hide(); 
   }, 

   addError: function( msg, ref ) {
      this.content += this.errStart + msg + this.errEnd; 
      if ( ref ) {
         if ( ref instanceof Array )
            this.refs.concat( ref );
         else
            this.refs.push( ref );
         for ( var i in this.refs )
            $( this.refs[i] ).addClass( "ui-state-error" );
      }
      $(this.element).html( this.logStart + this.content + this.logEnd ).show();
   }, 

   hasError: function()
   {
      if ( this.refs.length )
         return true;
      return false;
   },
});

Mogę dodać do niego komunikaty o błędach i odniesienia do elementów strony, które zostaną wprowadzone w stan błędu. Używam go do weryfikacji okien dialogowych. W metodzie „addError” mogę przekazać pojedynczy identyfikator lub tablicę identyfikatorów, na przykład:

$( "#registerDialogError" ).miniErrorLog( 
   'addError', 
   "Your passwords don't match.", 
   [ "#registerDialogPassword1", "#registerDialogPassword2" ] );

Ale kiedy przekazuję tablicę identyfikatorów, to nie działa. Problem jest w następujących wierszach (myślę):

if ( ref instanceof Array )
   this.refs.concat( ref );
else
   this.refs.push( ref );

Dlaczego to nie działa. this.refs i ref są zarówno tablicami. Dlaczego więc konkat nie działa?

Bonus: czy robię coś głupiego w tym widżecie? To moja pierwsza.

Rafael Baptista
źródło

Odpowiedzi:

265

Metoda concat nie zmienia oryginalnej tablicy, musisz ją ponownie przypisać.

if ( ref instanceof Array )
   this.refs = this.refs.concat( ref );
else
   this.refs.push( ref );
Alcides Queiroz Aguiar
źródło
5
Zrobiło to. Pomyślałbym, że metoda concat na obiekcie zostanie dołączona do obiektu. Ale myślę, że nie tak to działa.
Rafael Baptista
3
@Rafael: pushMetoda to robi, możesz to zrobić[].push.apply(this.refs, ref)
Bergi
80

Oto powód, dla którego:

Definicja i użycie

Metoda concat () służy do łączenia dwóch lub więcej tablic.

Ta metoda nie zmienia istniejących tablic, ale zwraca nową tablicę zawierającą wartości połączonych tablic.

Musisz przypisać wynik konkatenacji z powrotem do posiadanej tablicy.

Konstantin Dinev
źródło
2
Dlaczego, och, dlaczego, zawsze muszę o tym zapominać?
Jeff Lowery
9

Aby rozwinąć Konstantin Dinev:

.concat()nie dodaje się do bieżącego obiektu, więc to nie zadziała:

foo.bar.concat(otherArray);

To będzie:

foo.bar = foo.bar.concat(otherArray);
mewc
źródło
5

musisz ponownie przypisać wartość za pomocą = do tablicy, którą chcesz uzyskać określoną wartość

let array1=[1,2,3,4];
let array2=[5,6,7,8];

array1.concat(array2);
console.log('NOT WORK :  array1.concat(array2); =>',array1);

array1= array1.concat(array2);
console.log('WORKING :  array1 = array1.concat(array2); =>',array1);

Saurabh Mistry
źródło
1
dataArray = dataArray.concat(array2)
PRATHYUSH P
źródło