Javascript Array Concat funktioniert nicht. Warum?

92

Also habe ich dieses jqueryui-Widget erstellt. Es erstellt ein Div, in das ich Fehler streamen kann. Der Widget-Code sieht folgendermaßen aus:

$.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;
   },
});

Ich kann Fehlermeldungen hinzufügen und Verweise auf Seitenelemente, die in einen Fehlerzustand versetzt werden. Ich benutze es, um Dialoge zu validieren. In der "addError" -Methode kann ich eine einzelne ID oder ein Array von IDs wie folgt übergeben:

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

Aber wenn ich eine Reihe von IDs übergebe, funktioniert das nicht. Das Problem liegt in den folgenden Zeilen (glaube ich):

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

Warum funktioniert das nicht? this.refs und ref sind beide Arrays. Warum funktioniert das Concat nicht?

Bonus: Mache ich noch etwas Dummes in diesem Widget? Es ist mein erster.

Rafael Baptista
quelle

Antworten:

256

Die concat-Methode ändert das ursprüngliche Array nicht, Sie müssen es neu zuweisen.

if ( ref instanceof Array )
   this.refs = this.refs.concat( ref );
else
   this.refs.push( ref );
Alcides Queiroz Aguiar
quelle
4
Das hat es geschafft. Ich hätte gedacht, dass eine Concat-Methode für ein Objekt an das Objekt angehängt wird. Aber ich denke, so funktioniert das nicht.
Rafael Baptista
3
@ Rafael: Die pushMethode macht das, Sie könnten es tun[].push.apply(this.refs, ref)
Bergi
77

Hier ist der Grund warum:

Definition und Verwendung

Die concat () -Methode wird verwendet, um zwei oder mehr Arrays zu verbinden.

Diese Methode ändert die vorhandenen Arrays nicht, sondern gibt ein neues Array zurück, das die Werte der verknüpften Arrays enthält.

Sie müssen das Ergebnis der Verkettung wieder in Ihrem Array zuweisen.

Konstantin Dinev
quelle
2
Warum, oh warum, muss ich das immer vergessen?
Jeff Lowery
8

Um Konstantin Dinev zu erweitern:

.concat()wird nicht zum aktuellen Objekt hinzugefügt, daher funktioniert dies nicht :

foo.bar.concat(otherArray);

Dieser Wille:

foo.bar = foo.bar.concat(otherArray);
mewc
quelle
4

Sie müssen den Wert mit = dem Array neu zuweisen, damit Sie einen präzisen Wert erhalten

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
quelle
1
dataArray = dataArray.concat(array2)
PRATHYUSH P.
quelle