জাভাস্ক্রিপ্ট অ্যারে কনক্যাট কাজ করছে না। কেন?


97

সুতরাং আমি এই jqueryui উইজেট তৈরি করেছি। এটি এমন একটি ডিভ তৈরি করে যাতে আমি ত্রুটিগুলি স্ট্রিম করতে পারি। উইজেট কোডটি এর মতো দেখাচ্ছে:

$.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;
   },
});

আমি এতে ত্রুটি বার্তাগুলি যুক্ত করতে পারি এবং পৃষ্ঠার উপাদানগুলির উল্লেখ যা একটি ত্রুটি অবস্থার মধ্যে রাখবে। আমি এটি ডায়ালগগুলি যাচাই করতে ব্যবহার করি। "অ্যাডেরর" পদ্ধতিতে আমি একটি আইডি, বা আইডির একটি অ্যারে পাস করতে পারি:

$( "#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 এবং রেফ উভয় অ্যারে। তাহলে কনক্যাট কাজ করে না কেন?

বোনাস: আমি কি এই উইজেটে বোবা আরও কিছু করছি? এটা আমার প্রথম।


উত্তর:


266

কনক্যাট পদ্ধতিটি মূল অ্যারে পরিবর্তন করে না, আপনাকে এটি পুনরায় নিয়োগ করতে হবে।

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

4
এটা এটা করেছে। আমি ভেবেছিলাম যে কোনও বস্তুর উপর একটি কনক্যাট পদ্ধতিটি বস্তুর সাথে সংযুক্ত হবে। তবে আমার ধারণা এটি কীভাবে কাজ করে না।
রাফায়েল ব্যাপটিস্তা

4
@ রাফায়েল: pushপদ্ধতিটি তা করে, আপনি তা করতে পারেন[].push.apply(this.refs, ref)
বার্গি

80

এর কারণ এখানে:

সংজ্ঞা এবং ব্যবহার

দুই বা ততোধিক অ্যারে যোগ দেওয়ার জন্য কনক্যাট () পদ্ধতি ব্যবহার করা হয়।

এই পদ্ধতিটি বিদ্যমান অ্যারেগুলিকে পরিবর্তন করে না, তবে যুক্ত অ্যারেগুলির মান সমেত একটি নতুন অ্যারে প্রদান করে।

আপনার কাছে থাকা অ্যারেতে আপনাকে কনকেন্টেশনটির ফলাফল নির্ধারণ করতে হবে।


4
কেন, ওহ কেন, আমি কি সবসময় এটি ভুলে যেতে পারি?
জেফ লোরি

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


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.