Javascript Array Concat không hoạt động. Tại sao?


97

Vì vậy, tôi đã tạo tiện ích jqueryui này. Nó tạo ra một div mà tôi có thể truyền lỗi vào. Mã tiện ích trông giống như sau:

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

Tôi có thể thêm thông báo lỗi vào đó và các tham chiếu đến các phần tử trang sẽ được đưa vào trạng thái lỗi. Tôi sử dụng nó để xác thực các hộp thoại. Trong phương thức "addError", tôi có thể chuyển vào một id duy nhất hoặc một mảng id, như sau:

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

Nhưng khi tôi truyền vào một mảng id, nó không hoạt động. Vấn đề là ở những dòng sau (tôi nghĩ):

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

Tại sao concat đó không hoạt động. this.refs và ref đều là mảng. Vậy tại sao concat không hoạt động?

Phần thưởng: tôi có đang làm gì khác ngu ngốc trong tiện ích này không? Đây là cái đầu tiên của tôi.


Câu trả lời:


265

Phương thức concat không thay đổi mảng ban đầu, bạn cần gán lại nó.

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

5
Điều đó đã làm được. Tôi đã nghĩ rằng một phương thức concat trên một đối tượng sẽ nối vào đối tượng. Nhưng tôi đoán đó không phải là cách nó hoạt động.
Rafael Baptista

3
@Rafael: pushPhương pháp làm được điều đó, bạn có thể làm được[].push.apply(this.refs, ref)
Bergi 9/10/12

80

Đây là lý do tại sao:

Định nghĩa và Cách sử dụng

Phương thức concat () được sử dụng để nối hai hoặc nhiều mảng.

Phương thức này không thay đổi các mảng hiện có, nhưng trả về một mảng mới, chứa các giá trị của các mảng đã nối.

Bạn cần gán lại kết quả của phép nối trong mảng mà bạn có.


2
Tại sao, ôi tại sao, tôi phải luôn quên điều này?
Jeff Lowery

9

Để mở rộng về Konstantin Dinev:

.concat()không thêm vào đối tượng hiện tại, vì vậy điều này sẽ không hoạt động:

foo.bar.concat(otherArray);

Điều này sẽ:

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

5

bạn phải gán lại giá trị bằng = cho mảng mà bạn muốn nhận giá trị nối

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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.