Javascript Array Concat no funciona. ¿Por qué?


97

Así que he creado este widget jqueryui. Crea un div en el que puedo transmitir errores. El código del widget se ve así:

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

Puedo agregarle mensajes de error y referencias a elementos de la página que se pondrán en un estado de error. Lo uso para validar diálogos. En el método "addError" puedo pasar una sola identificación, o una matriz de identificaciones, como esta:

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

Pero cuando paso una serie de identificaciones, no funciona. El problema está en las siguientes líneas (creo):

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

¿Por qué no funciona ese concat? this.refs y ref son matrices. Entonces, ¿por qué no funciona el concat?

Bono: ¿estoy haciendo algo más tonto en este widget? Es mi primero.


Respuestas:


266

El método concat no cambia la matriz original, debe reasignarla.

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

5
Eso lo hizo. Habría pensado que un método concat en un objeto se agregaría al objeto. Pero supongo que no es así como funciona.
Rafael Baptista

3
@Rafael: El pushmétodo hace eso, podrías hacerlo[].push.apply(this.refs, ref)
Bergi

80

Esta es la razón por la que:

Definición y uso

El método concat () se utiliza para unir dos o más matrices.

Este método no cambia las matrices existentes, pero devuelve una nueva matriz, que contiene los valores de las matrices unidas.

Debe volver a asignar el resultado de la concatenación en la matriz que tiene.


2
¿Por qué, oh por qué, siempre debo olvidar esto?
Jeff Lowery

9

Para ampliar Konstantin Dinev:

.concat()no se agrega al objeto actual, por lo que esto no funcionará:

foo.bar.concat(otherArray);

Esta voluntad:

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

5

tiene que reasignar el valor usando = a la matriz, que desea obtener el valor concentrado

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);


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.