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

แต่เมื่อฉันผ่านอาร์เรย์ของ id มันไม่ได้ผล ปัญหาอยู่ในบรรทัดต่อไปนี้ (ฉันคิดว่า):

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

ทำไม concat ไม่ทำงาน this.refs และ ref เป็นทั้งอาร์เรย์ แล้วทำไม concat ไม่ทำงาน?

โบนัส: ฉันทำอะไรโง่ ๆ ในวิดเจ็ตนี้หรือไม่? มันเป็นคนแรกของฉัน


คำตอบ:


266

เมธอด concat ไม่เปลี่ยนอาร์เรย์เดิมคุณต้องกำหนดใหม่

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

5
ที่ทำมัน ฉันคิดว่าวิธีการ concat บนวัตถุจะผนวกเข้ากับวัตถุ แต่ฉันเดาว่านั่นไม่ใช่วิธีการทำงาน
Rafael Baptista

3
@ ราฟาเอล: pushวิธีนี้คุณทำได้[].push.apply(this.refs, ref)
Bergi

80

นี่คือเหตุผลว่าทำไม:

ความหมายและการใช้งาน

concat () วิธีการใช้เพื่อรวมอาร์เรย์สองอาร์เรย์ขึ้นไป

วิธีนี้ไม่เปลี่ยนอาร์เรย์ที่มีอยู่ แต่ส่งคืนอาร์เรย์ใหม่ที่มีค่าของอาร์เรย์ที่เข้าร่วม

คุณต้องกำหนดผลลัพธ์ของการต่อข้อมูลกลับในอาร์เรย์ที่คุณมี


2
ทำไมโอ้ทำไมฉันต้องลืมสิ่งนี้อยู่เสมอ?
Jeff Lowery

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.