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


97

Итак, я создал этот виджет 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» я могу передать один идентификатор или массив идентификаторов, например:

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

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

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

Почему не работает этот конкат. this.refs и ref являются массивами. Так почему же не работает concat?

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


Ответы:


266

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

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

5
Это сделало это. Я бы подумал, что к объекту будет добавлен метод concat для объекта. Но я думаю, что это не так.
Рафаэль Баптиста,

3
@Rafael: pushМетод делает это, вы могли бы[].push.apply(this.refs, ref)
Берги

80

Вот почему:

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

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

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

Вам нужно присвоить результат конкатенации обратно в имеющийся у вас массив.


2
Почему, ну почему я всегда должен это забывать?
Джефф Лоури

9

Чтобы подробнее рассказать о Константине Диневе:

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

foo.bar.concat(otherArray);

Это будет:

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

5

вам нужно повторно присвоить значение с помощью = массиву, который вы хотите получить объединенное значение

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.