Javascript Array Concat不能正常工作.为什么?

Raf*_*sta 77 javascript jquery jquery-ui

所以我创建了这个jqueryui小部件.它创建了一个div,我可以将错误输入.小部件代码如下所示:

$.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;
   },
});
Run Code Online (Sandbox Code Playgroud)

我可以在其中添加错误消息,并引用将进入错误状态的页面元素.我用它来验证对话框.在"addError"方法中,我可以传入一个id或一个id数组,如下所示:

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

但是当我传入一个id的数组时,它不起作用.问题在于以下几行(我认为):

if ( ref instanceof Array )
   this.refs.concat( ref );
else
   this.refs.push( ref );
Run Code Online (Sandbox Code Playgroud)

为什么连续工作都没有.this.refs和ref都是数组.那么为什么连续工作呢?

额外奖励:我在这个小部件中做了什么其他的蠢事吗?这是我的第一个.

Alc*_*iar 219

concat方法不会更改原始数组,您需要重新分配它.

if ( ref instanceof Array )
   this.refs = this.refs.concat( ref );
else
   this.refs.push( ref );
Run Code Online (Sandbox Code Playgroud)

  • 这样做了.我原以为对象上的concat方法会附加到对象上.但我猜这不是它的工作原理. (4认同)
  • @Rafael:`push`方法可以做到,你可以做`[] .push.apply(this.refs,ref)` (3认同)

Kon*_*nev 67

原因如下:

定义和用法

concat()方法用于连接两个或多个数组.

此方法不会更改现有数组,但会返回一个新数组,其中包含已连接数组的值.

您需要将连接的结果分配回您拥有的数组中.

  • 为什么,哦为什么,我必须总是忘记这一点? (4认同)

mew*_*ewc 11

要扩展 Konstantin Dinev:

.concat()不添加到当前对象,因此这将不会工作:

foo.bar.concat(otherArray);
Run Code Online (Sandbox Code Playgroud)

这会:

foo.bar = foo.bar.concat(otherArray);
Run Code Online (Sandbox Code Playgroud)


Sau*_*try 9

您必须使用 = 重新分配值到数组,您希望获得连接值

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);
Run Code Online (Sandbox Code Playgroud)