जावास्क्रिप्ट 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

कॉन्कैट विधि मूल सरणी को नहीं बदलती है, आपको इसे पुन: असाइन करने की आवश्यकता है।

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

5
यही किया। मुझे लगता है कि एक वस्तु पर एक संक्षिप्त विधि वस्तु के लिए संलग्न होगा। लेकिन मुझे लगता है कि यह कैसे काम करता है।
राफेल बैप्टिस्टा

3
@Rafael: pushविधि है कि करता है, तुम कर सकते हो[].push.apply(this.refs, ref)
Bergi

80

यहाँ कारण है:

परिभाषा और उपयोग

दो या दो से अधिक सरणियों में शामिल होने के लिए कॉनैट () पद्धति का उपयोग किया जाता है।

यह विधि मौजूदा सरणियों को परिवर्तित नहीं करती है, लेकिन एक नई सरणी लौटाती है, जिसमें शामिल सरणियों के मान होते हैं।

आपको अपने पास मौजूद सरणी में वापस संघनन का परिणाम निर्दिष्ट करना होगा।


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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.