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 - це масиви. То чому конкат не працює?

Бонус: я роблю ще щось німе в цьому віджеті? Це мій перший.


Відповіді:


265

Метод concat не змінює вихідний масив, вам потрібно перепризначити його.

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

5
Це вдалося. Я міг би подумати, що метод concat на об'єкті додасться до об'єкта. Але, мабуть, не так це працює.
Рафаель Баптіста

3
@ Рафаель: pushМетод робить це, ти міг би зробити[].push.apply(this.refs, ref)
Бергі

80

Ось причина:

Визначення та використання

Метод concat () використовується для об'єднання двох або більше масивів.

Цей метод не змінює існуючі масиви, а повертає новий масив, що містить значення об’єднаних масивів.

Вам потрібно призначити результат об’єднання назад у масив, який у вас є.


2
Чому, ну чому, я повинен завжди це забувати?
Джеф Лоуері

9

Щоб розширити Костянтина Дінева:

.concat()не додає до поточного об’єкта, тому це не буде працювати:

foo.bar.concat(otherArray);

Це буде:

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

5

вам слід повторно призначити значення за допомогою = to array, який ви хочете отримати зібране значення

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.