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"메소드에서 다음과 같이 단일 ID 또는 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이 작동하지 않는 이유는 무엇입니까?

보너스 :이 위젯에서 다른 멍청한 일을하고 있습니까? 첫 번째입니다.


답변:


265

concat 메서드는 원래 배열을 변경하지 않으므로 다시 할당해야합니다.

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

5
그게됐다. 객체에 대한 concat 메서드가 객체에 추가 될 것이라고 생각했을 것입니다. 그러나 나는 그것이 작동하는 방식이 아니라고 생각합니다.
Rafael Baptista 2012 년

3
@Rafael : push방법은 그렇게 할 수 있습니다.[].push.apply(this.refs, ref)
Bergi

80

그 이유는 다음과 같습니다.

정의 및 사용법

concat () 메서드는 둘 이상의 배열을 결합하는 데 사용됩니다.

이 메서드는 기존 배열을 변경하지 않지만 결합 된 배열의 값을 포함하는 새 배열을 반환합니다.

연결의 결과를 보유한 배열에 다시 할당해야합니다.


2
왜, 왜, 나는 항상 이것을 잊어야합니까?
Jeff Lowery 2011

9

Konstantin Dinev에서 확장하려면 :

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.