Javascript Array Concat çalışmıyor. Neden?


97

Bu yüzden bu jqueryui widget'ını oluşturdum. Hataları akışa alabileceğim bir div oluşturur. Widget kodu şuna benzer:

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

Buna hata mesajları ve hata durumuna getirilecek sayfa öğelerine referanslar ekleyebilirim. Bunu diyalogları doğrulamak için kullanıyorum. "AddError" yönteminde, tek bir kimliği veya bir dizi kimliği iletebilirim, örneğin:

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

Ama bir id dizisini verdiğimde işe yaramıyor. Sorun şu satırlarda (sanırım):

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

Bu concat neden çalışmıyor? this.refs ve ref dizilerdir. Peki neden concat çalışmıyor?

Bonus: Bu widget'ta başka aptalca bir şey yapıyor muyum? Bu benim ilkim.


Yanıtlar:


266

Concat yöntemi orijinal diziyi değiştirmez, onu yeniden atamanız gerekir.

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

5
Başardı. Bir nesne üzerindeki concat yönteminin nesneye ekleneceğini düşünürdüm. Ama sanırım böyle yürümüyor.
Rafael Baptista

3
@Rafael: pushYöntem bunu yapıyor, yapabilirsin[].push.apply(this.refs, ref)
Bergi

80

Nedeni şu:

Tanım ve Kullanım

Concat () yöntemi, iki veya daha fazla diziyi birleştirmek için kullanılır.

Bu yöntem var olan dizileri değiştirmez, ancak birleştirilen dizilerin değerlerini içeren yeni bir dizi döndürür.

Birleştirmenin sonucunu sahip olduğunuz diziye geri atamanız gerekir.


2
Neden, ah neden, bunu hep unutmalıyım?
Jeff Lowery

9

Konstantin Dinev'i genişletmek için:

.concat()Bu nedenle, mevcut nesnenin eklemez değil çalışır:

foo.bar.concat(otherArray);

Bu irade:

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

5

Birleştirilmiş değer elde etmek istediğiniz değeri diziye = kullanarak yeniden atamanız gerekir

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


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.