Подтвердить что ты не робот

Javascript Array Concat не работает. Зачем?

Итак, я создал этот виджет 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;
   },
});

Я могу добавить в него сообщения об ошибках, а ссылки на элементы страницы, которые будут помещены в состояние ошибки. Я использую его для проверки диалогов. В методе "addError" я могу передать один id или массив идентификаторов, например:

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

Но когда я передаю массив id, это не работает. Проблема заключается в следующих строках (я думаю):

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

Почему это не конкатентная работа. this.refs и ref - оба массива. Итак, почему не работает concat?

Бонус: я делаю что-то еще немое в этом виджете? Это мой первый.

4b9b3361

Ответ 1

Метод concat не изменяет исходный массив, вам нужно переназначить его.

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

Ответ 2

Вот почему:

Определение и использование

Метод concat() используется для объединения двух или более массивов.

Этот метод не изменяет существующие массивы, но возвращает новый массив, содержащий значения объединенных массивов.

Вам нужно назначить результат конкатенации в массиве, который у вас есть.

Ответ 3

Подробнее о Константине Диневе:

.concat() не добавляет к текущему объекту, так что это не будет работать:

foo.bar.concat(otherArray);

Это будет:

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

Ответ 4

dataArray = dataArray.concat(array2)