116 votes

Javascript Array Concat ne fonctionne pas. Pourquoi ?

J'ai donc créé ce widget jqueryui. Il crée un div dans lequel je peux diffuser les 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 en erreur. Je l'utilise pour valider les boîtes de dialogue. Dans la méthode "addError", je peux passer un seul id, ou un tableau d'id, comme ceci :

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

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

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

Pourquoi la concaténation ne fonctionne-t-elle 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.

322voto

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

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

87voto

En voici la raison :

Définition et utilisation

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

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

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

20voto

mewc Points 184

Pour développer sur Konstantin Dinev :

.concat() ne s'ajoute pas à l'objet courant, donc cela va pas travail :

foo.bar.concat(otherArray);

Ce sera :

foo.bar = foo.bar.concat(otherArray);

14voto

Saurabh Mistry Points 3325

Vous devez réassigner la valeur en utilisant = au tableau, que vous voulez obtenir la valeur concaténé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);

2voto

PRATHYUSH P Points 131
dataArray = dataArray.concat(array2)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X