javascript - করব - ধৈর্য সম্পর্কে হাদিস




একটি পরিবর্তনশীল জাভাস্ক্রিপ্ট একটি অ্যারে যদি আপনি কিভাবে পরীক্ষা করবেন? (16)

আধুনিক ব্রাউজারে (এবং কিছু উত্তরাধিকার ব্রাউজার), আপনি করতে পারেন

Array.isArray(obj)

(ক্রোম 5, ফায়ারফক্স 4.0, IE 9, অপেরা 10.5 এবং সাফারি 5 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray )

যদি আপনাকে IE এর পুরোনো সংস্করণগুলি সমর্থন করতে হয় তবে আপনি es5-shim ব্যবহার করতে পারেন Polyfill Array.isArray; অথবা নিম্নলিখিত যোগ করুন

# only implement if no native implementation is available
if (typeof Array.isArray === 'undefined') {
  Array.isArray = function(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
  }
};

আপনি যদি jQuery ব্যবহার করেন তবে আপনি jQuery.isArray(obj) বা $.isArray(obj) ব্যবহার করতে পারেন। আপনি যদি আন্ডারস্কোর ব্যবহার করেন তবে আপনি _.isArray(obj) ব্যবহার করতে পারেন

আপনি যদি বিভিন্ন ফ্রেমে তৈরি অ্যারে সনাক্ত করার প্রয়োজন হয় না তবে আপনি শুধু instanceof ব্যবহার করতে পারেন

obj instanceof Array

দ্রষ্টব্য : arguments শব্দ যা একটি ফাংশনের আর্গুমেন্ট অ্যাক্সেস করতে ব্যবহার করা যেতে পারে তা অ্যারে নয়, যদিও এটি (সাধারণত) একের মতো আচরণ করে:

var func = function() {
  console.log(arguments)        // [1, 2, 3]
  console.log(arguments.length) // 3
  console.log(Array.isArray(arguments)) // false !!!
  console.log(arguments.slice)  // undefined (Array.prototype methods not available)
  console.log([3,4,5].slice)    // function slice() { [native code] } 
}
func(1, 2, 3)

এই প্রশ্নটি ইতিমধ্যে একটি উত্তর আছে:

আমি একটি ভেরিয়েবল হয় একটি অ্যারে বা জাভাস্ক্রিপ্ট একটি একক মান কিনা চেক করতে চাই।

আমি একটি সম্ভাব্য সমাধান খুঁজে পেয়েছি ...

if (variable.constructor == Array)...

এই কি করা যেতে পারে সেরা উপায়?


আপনি ব্যবহার করতে পারেন:

if (value instanceof Array) {
  alert('value is Array!');
} else {
  alert('Not an array');
}

এই আমার একটি সুন্দর মার্জিত সমাধান মনে হয়, কিন্তু প্রতিটি তার নিজস্ব।

সম্পাদনা:

ES5 হিসাবে এখন আছে:

Array.isArray(value);

তবে আপনি পুরোনো ব্রাউজারগুলি ভাঙ্গবেন না, যতক্ষণ না আপনি পলিফিল ব্যবহার করছেন (মূলত ... IE8 বা অনুরূপ)।


আমি jQuery উল্লেখ কেউ লক্ষ্য, কিন্তু আমি একটি isArray() ফাংশন ছিল জানি না। এটা 1.3 সংস্করণ যোগ করা হয়েছে সক্রিয় আউট।

পিটারের পরামর্শ অনুসারে jQuery এটি প্রয়োগ করে:

isArray: function( obj ) {
    return toString.call(obj) === "[object Array]";
},

ইতিমধ্যে জাভাস্ক্রিপ্টে অনেক বিশ্বাস রেখে (বিশেষত ক্রস ব্রাউজারের সামঞ্জস্যের জন্য তাদের কৌশল) আমি সংস্করণ 1.3 এ আপগ্রেড করব এবং তাদের ফাংশন ব্যবহার করবো (যে আপগ্রেডিংটি অনেকগুলি সমস্যা সৃষ্টি করে না) অথবা এই প্রস্তাবিত পদ্ধতিটি সরাসরি আমার সাথে ব্যবহার করুন কোড।

পরামর্শের জন্য অনেক ধন্যবাদ।


আমি myObj.constructor == অবজেক্ট এবং myArray.constructor ব্যবহার করে মনে করি == অ্যারে সেরা উপায়। তার স্ট্রিং ব্যবহার করে প্রায় 20x দ্রুত ()। আপনি যদি নিজের নির্মাতাদের সাথে বস্তুগুলি প্রসারিত করেন এবং সেই সৃষ্টিকে "বস্তু" হিসাবে বিবেচনা করতে চান তবে এটি কাজ করে না, তবে অন্যথায় এটি দ্রুততর। টাইপফোনের কনস্ট্রাক্টর পদ্ধতির মতো দ্রুত কিন্তু টাইপ [] == 'অবজেক্ট' সত্যটি ফেরত দেয় যা প্রায়শই অনিবার্য হবে। http://jsperf.com/constructor-vs-tostring

নোট। কনস্ট্রাক্টর একটি ত্রুটি নিক্ষেপ করবে তাই যদি আপনি নাল মানগুলির জন্য চেক করতে পারেন তবে প্রথমে আপনাকে করতে হবে (testThing! == null) {}


আমি কোডের এই লাইনটি ব্যবহার করছিলাম:

if (variable.push) {
   // variable is array, since AMAIK only arrays have push() method.
}

আমি ব্যক্তিগতভাবে পিটারের পরামর্শ পছন্দ করি: https://.com/a/767499/414784 (ECMAScript এর জন্য 3. Array.isArray() 5 এর জন্য, Array.isArray() ) ব্যবহার করুন

পোস্টে মন্তব্যগুলি ইঙ্গিত করে যে, যদি toString() পরিবর্তন করা হয় তবে অ্যারে চেক করার উপায়টি ব্যর্থ হবে। আপনি যদি সত্যিই নির্দিষ্ট হতে চান এবং toString() পরিবর্তন করা না থাকে তবে নিশ্চিত করুন এবং বস্তুর বর্গ বৈশিষ্ট্য ( [object Array] কোনও অ্যারের একটি শ্রেণির [object Array] বৈশিষ্ট্যের সাথে কোন সমস্যা নেই, তবে আমি সুপারিশ করছি এটার মতো কিছু:

//see if toString returns proper class attributes of objects that are arrays
//returns -1 if it fails test
//returns true if it passes test and it's an array
//returns false if it passes test and it's not an array
function is_array(o)
{
    // make sure an array has a class attribute of [object Array]
    var check_class = Object.prototype.toString.call([]);
    if(check_class === '[object Array]')
    {
        // test passed, now check
        return Object.prototype.toString.call(o) === '[object Array]';
    }
    else
    {
        // may want to change return value to something more desirable
        return -1; 
    }
}

উল্লেখ্য, জাভাস্ক্রিপ্টে Array.isArray() গাইড 6 ষ্ঠ সংস্করণ, 7.10, এটি বলে যে Array.isArray() ECMAScript 5 এ Object.prototype.toString.call() ব্যবহার করে প্রয়োগ করা হয়েছে। এছাড়াও মনে রাখবেন যে আপনি যদি toString() ' গুলি বাস্তবায়ন পরিবর্তন, আপনি খুব পরিবর্তন প্রতিটি পদ্ধতিতে নির্মিত অন্যান্য সম্পর্কে চিন্তা করা উচিত। কেন push() ? কেউ এটা পরিবর্তন করতে পারেন! যেমন একটি পদ্ধতি নির্বোধ। উপরের চেকটি toString() পরিবর্তন সম্পর্কে toString() প্রস্তাবিত সমাধান, তবে আমি বিশ্বাস করি চেকটি অপ্রয়োজনীয়।


একটি পরিবর্তনশীল একটি অ্যারে কিনা না চেক করার বিভিন্ন উপায় আছে। সেরা সমাধান আপনি চয়ন করেছেন।

variable.constructor === Array

এটি ক্রোমের দ্রুততম পদ্ধতি এবং সম্ভবত অন্যান্য সমস্ত ব্রাউজার। সমস্ত অ্যারে বস্তু, তাই কন্সট্রাকটর সম্পত্তি পরীক্ষণ জাভাস্ক্রিপ্ট ইঞ্জিনগুলির জন্য একটি দ্রুত প্রক্রিয়া।

যদি কোনও বস্তুর সম্পত্তি অ্যারে থাকে তবে খুঁজে বের করার ক্ষেত্রে আপনার যদি সমস্যা হয় তবে আপনাকে অবশ্যই সম্পত্তিটি যাচাই করতে হবে।

variable.prop && variable.prop.constructor === Array

অন্য কিছু উপায় হল:

variable instanceof Array

এই পদ্ধতিটি প্রথম উদাহরণ হিসাবে গতি 1/3 চালায়। এখনও চমত্কার কঠিন, ক্লিনার দেখায়, যদি আপনি প্রশংসনীয় কোড সম্পর্কে সব না এবং পারফরম্যান্স এ তাই না। উল্লেখ্য যে সংখ্যার জন্য পরীক্ষণ variable instanceof Number হিসাবে কাজ করে না variable instanceof Number সবসময় falseআপডেট: instanceof এখন গতি 2/3 যায়!

Array.isArray(variable)

এই শেষ এক, আমার মতে ugliest, এবং এটি ধীরতম এক। প্রথম উদাহরণ হিসাবে গতি 1/5 চলমান। Array.prototype, আসলে একটি অ্যারে। আপনি এখানে এটি সম্পর্কে আরও পড়তে পারেন https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray

তাই এখনো অন্য আপডেট

Object.prototype.toString.call(variable) === '[object Array]';

এই লোকটি অ্যারে চেক করার চেষ্টা করার জন্য ধীরতম। যাইহোক, আপনি যে কোনও ধরণের সন্ধানের জন্য এটি একটি স্টপ শপ। যাইহোক, যেহেতু আপনি একটি অ্যারে খুঁজছেন, উপরের উপরে দ্রুত পদ্ধতি ব্যবহার করুন।

এছাড়াও, আমি কিছু পরীক্ষা http://jsperf.com/instanceof-array-vs-array-isarray/33 : http://jsperf.com/instanceof-array-vs-array-isarray/33 সুতরাং কিছু মজা করুন এবং এটি পরীক্ষা করে দেখুন।

দ্রষ্টব্য: @sscapeNetscape আরেকটি পরীক্ষা তৈরি করেছে যা jsperf.com ডাউন হয়েছে। http://jsben.ch/#/QgYAV আমি জেনারেল লিঙ্কটি যখন অনলাইনে ফিরে আসি তখনই আসল লিঙ্কটি থাকার জন্য আমি নিশ্চিত ছিলাম।


এটি একটি পুরনো প্রশ্ন কিন্তু একই সমস্যা হচ্ছে আমি একটি খুব মার্জিত সমাধান খুঁজে পেয়েছি যা আমি ভাগ করতে চাই।

অ্যারে একটি প্রোটোটাইপ যোগ করা এটা খুব সহজ করে তোলে

Array.prototype.isArray = true;

এখন আপনার যদি কোনও বস্তু থাকে তবে আপনি এটি পরীক্ষা করতে চান যে এটির একটি অ্যারের যা আপনার প্রয়োজন তা হল নতুন সম্পত্তিটি যাচাই করা

var box = doSomething();

if (box.isArray) {
    // do something
}

isArray শুধুমাত্র একটি অ্যারে যদি উপলব্ধ



ক্রোকফোর্ডের জাভাস্ক্রিপ্টে গুড যন্ত্রাংশ , প্রদত্ত যুক্তিটি একটি অ্যারে কিনা তা পরীক্ষা করার জন্য একটি ফাংশন রয়েছে:

var is_array = function (value) {
    return value &&
        typeof value === 'object' &&
        typeof value.length === 'number' &&
        typeof value.splice === 'function' &&
        !(value.propertyIsEnumerable('length'));
};

সে ব্যাখ্যা করছে:

প্রথমত, আমরা মূল্য সত্য কিনা জিজ্ঞাসা। আমরা নল এবং অন্যান্য মিথ্যাবাদী মান প্রত্যাখ্যান করতে এই কাজ। দ্বিতীয়ত, আমরা জিজ্ঞাসা করি টাইপফিউ মানটি 'বস্তু'। বস্তু, অ্যারে এবং (অদ্ভুত) নিল জন্য এটি সত্য হবে। তৃতীয়ত, আমরা জিজ্ঞাসা করি যে মানটির দৈর্ঘ্য একটি দৈর্ঘ্য। এটি অ্যারের জন্য সর্বদা সত্য হবে, তবে সাধারণত বস্তুর জন্য নয়। চতুর্থ, আমরা মূল্য একটি splice পদ্ধতি রয়েছে কিনা জিজ্ঞাসা। এই আবার সব অ্যারের জন্য সত্য হতে হবে। অবশেষে, আমরা জিজ্ঞাসা করি দৈর্ঘ্য সম্পত্তির সংখ্যা কত? (দৈর্ঘ্যের জন্য লুপে উত্পন্ন হবে?)। যে সব অ্যারের জন্য মিথ্যা হবে। এটি পাওয়া যায় অ্যারের জন্য এটি সবচেয়ে নির্ভরযোগ্য পরীক্ষা। এটা খুবই জটিল যে এটি দুর্ভাগ্যজনক।


তাদের নিজস্ব quirks সঙ্গে একাধিক সমাধান আছে। এই পৃষ্ঠাটি একটি ভাল ওভারভিউ দেয়। এক সম্ভাব্য সমাধান হল:

function isArray(o) {
  return Object.prototype.toString.call(o) === '[object Array]'; 
}

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

যেহেতু JQuery এখন এই ফাংশনটি অফার করে, আমি সর্বদা এটি ব্যবহার করব ...

$.isArray(obj);

(সংস্করণ 1.6.2 হিসাবে) এটি এখনও ফর্মের স্ট্রিংগুলির সাথে তুলনা করে প্রয়োগ করা হয়েছে

toString.call(obj) === "[object Array]"

যারা কোড-গলফের জন্য, কম সংখ্যক অক্ষরের সাথে অবিশ্বস্ত পরীক্ষা:

function isArray(a) {
  return a.map;
}

এটি সাধারণত ব্যবহৃত হয় যখন একটি আধিপত্য ট্র্যাভারসিং / ফ্ল্যাটিন করা হয়:

function golf(a) {
  return a.map?[].concat.apply([],a.map(golf)):a;
}

input: [1,2,[3,4,[5],6],[7,[8,[9]]]]
output: [1, 2, 3, 4, 5, 6, 7, 8, 9]

যেহেতু। লম্বা সম্পত্তি জাভাস্ক্রিপ্টে অ্যারের জন্য বিশেষ আপনি বলতে পারেন

obj.length === +obj.length // true if obj is an array

Underscorejs এবং অন্যান্য অন্যান্য লাইব্রেরি এই সংক্ষিপ্ত এবং সহজ কৌশল ব্যবহার।


Crockford মাধ্যমে:

function typeOf(value) {
    var s = typeof value;
    if (s === 'object') {
        if (value) {
            if (value instanceof Array) {
                s = 'array';
            }
        } else {
            s = 'null';
        }
    }
    return s;
}

ক্র্যাকফোর্ড উল্লেখযোগ্য ব্যর্থতা একটি ভিন্ন প্রেক্ষাপটে তৈরি করা অ্যারে সঠিকভাবে নির্ধারণ করার অক্ষমতা নয়, যেমন, window । এই অপর্যাপ্ত হলে যে পৃষ্ঠায় আরো অনেক পরিশীলিত সংস্করণ আছে।


w3schools থেকে:

function isArray(myArray) {
    return myArray.constructor.toString().indexOf("Array") > -1;
}





variables