Javascript Array Concat tidak berfungsi. Mengapa?

97

Jadi saya telah membuat widget jqueryui ini. Ini menciptakan div tempat saya dapat mengalirkan kesalahan. Kode widget terlihat seperti ini:

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

Saya dapat menambahkan pesan kesalahan ke dalamnya, dan referensi ke elemen halaman yang akan dimasukkan ke dalam status kesalahan. Saya menggunakannya untuk memvalidasi dialog. Dalam metode "addError" saya bisa mengirimkan satu id, atau array id, seperti ini:

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

Tetapi ketika saya mengirimkan array id itu tidak berfungsi. Masalahnya ada di baris berikut (menurut saya):

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

Mengapa concat itu tidak berhasil. this.refs dan ref keduanya adalah array. Jadi mengapa concat tidak berfungsi?

Bonus: apakah saya melakukan hal lain yang bodoh di widget ini? Ini yang pertama bagiku.

Rafael Baptista
sumber

Jawaban:

266

Metode concat tidak mengubah larik asli, Anda perlu menetapkannya kembali.

if ( ref instanceof Array )
   this.refs = this.refs.concat( ref );
else
   this.refs.push( ref );
Alcides Queiroz Aguiar
sumber
5
Itu berhasil. Saya akan berpikir bahwa metode concat pada suatu objek akan ditambahkan ke objek tersebut. Tapi saya rasa bukan itu cara kerjanya.
Rafael Baptista
3
@Rafael: pushMetodenya melakukan itu, Anda bisa melakukannya[].push.apply(this.refs, ref)
Bergi
80

Inilah alasannya mengapa:

Definisi dan Penggunaan

Metode concat () digunakan untuk menggabungkan dua atau lebih array.

Metode ini tidak mengubah array yang ada, tetapi mengembalikan array baru, berisi nilai dari array yang digabungkan.

Anda perlu menetapkan hasil penggabungan kembali dalam larik yang Anda miliki.

Konstantin Dinev
sumber
2
Mengapa, oh mengapa, saya harus selalu melupakan ini?
Jeff Lowery
9

Untuk memperluas Konstantin Dinev:

.concat()tidak menambah objek saat ini, jadi ini tidak akan berfungsi:

foo.bar.concat(otherArray);

Ini akan:

foo.bar = foo.bar.concat(otherArray);
mewc
sumber
5

Anda harus menetapkan kembali nilai menggunakan = ke array, yang Anda ingin mendapatkan nilai gabungan

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