Javascript Array Concat ne fonctionne pas. Pourquoi?

94

J'ai donc créé ce widget jqueryui. Cela crée un div dans lequel je peux diffuser des erreurs. Le code du widget ressemble à ceci:

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

Je peux y ajouter des messages d'erreur et des références à des éléments de page qui seront mis dans un état d'erreur. Je l'utilise pour valider les dialogues. Dans la méthode "addError", je peux passer un identifiant unique, ou un tableau d'identifiants, comme ceci:

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

Mais quand je passe dans un tableau d'identifiants, cela ne fonctionne pas. Le problème est dans les lignes suivantes (je pense):

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

Pourquoi ce concat ne fonctionne-t-il pas? this.refs et ref sont tous deux des tableaux. Alors pourquoi le concat ne fonctionne-t-il pas?

Bonus: est-ce que je fais autre chose de stupide dans ce widget? C'est mon premier.

Rafael Baptista
la source

Réponses:

261

La méthode concat ne modifie pas le tableau d'origine, vous devez le réaffecter.

if ( ref instanceof Array )
   this.refs = this.refs.concat( ref );
else
   this.refs.push( ref );
Alcides Queiroz Aguiar
la source
5
Cela l'a fait. J'aurais pensé qu'une méthode concat sur un objet s'ajouterait à l'objet. Mais je suppose que ce n'est pas ainsi que cela fonctionne.
Rafael Baptista
3
@Rafael: La pushméthode fait ça, vous pourriez le faire[].push.apply(this.refs, ref)
Bergi
79

Voici la raison pour laquelle:

Définition et utilisation

La méthode concat () est utilisée pour joindre deux ou plusieurs tableaux.

Cette méthode ne modifie pas les tableaux existants, mais renvoie un nouveau tableau, contenant les valeurs des tableaux joints.

Vous devez attribuer le résultat de la concaténation dans le tableau que vous avez.

Konstantin Dinev
la source
2
Pourquoi, oh pourquoi, dois-je toujours oublier cela?
Jeff Lowery
9

Pour développer Konstantin Dinev:

.concat()n'ajoute pas à l'objet actuel, donc cela ne fonctionnera pas :

foo.bar.concat(otherArray);

Cette volonté:

foo.bar = foo.bar.concat(otherArray);
mewc
la source
4

vous devez réattribuer la valeur en utilisant = au tableau, que vous voulez obtenir une valeur concatée

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