কোনও জিনিসটি অ্যারে কিনা তা কীভাবে পরীক্ষা করবেন?


2748

আমি এমন একটি ফাংশন লেখার চেষ্টা করছি যা হয় স্ট্রিংগুলির তালিকা বা একক স্ট্রিং গ্রহণ করে। যদি এটি একটি স্ট্রিং হয়, তবে আমি এটিকে কেবল একটি আইটেম দিয়ে একটি অ্যারেতে রূপান্তর করতে চাই, তাই আমি কোনও ত্রুটির আশঙ্কা ছাড়াই এটিকে লুপ করতে পারি।

ভেরিয়েবলটি একটি অ্যারে কিনা তা আমি কীভাবে পরীক্ষা করব?


আমি নীচের বিভিন্ন সমাধানগুলি বৃত্তাকার করেছি এবং একটি জেএসপিআইপি পরীক্ষা তৈরি করেছি । এগুলি সব দ্রুত, তাই কেবল ব্যবহার করুন Array.isArray- এটি এখন ভাল-সমর্থিত এবং ফ্রেম জুড়ে কাজ করে


6
আমি ভেবেছিলাম আপনি বোঝাতে চেয়েছিলেন 'বস্তুটি অ্যারে কিনা তা পরীক্ষা করা', তবে আপনি 'অবজেক্টটি স্ট্রিংগুলির একটি অ্যারে বা একটি একক স্ট্রিং' বিশেষভাবে পরীক্ষা করতে চান। নিশ্চিত তা না দেখলে? অথবা এটা আমার ঠিক? আমি আরো ভালো কিছু চিন্তা ছিল এই ... আমি এখানে কিছু অনুপস্থিত করছি?
rr1g0

149
টিএল; ডিআর - arr.constructor === Arrayদ্রুততম।
নেতা

3
jsben.ch/#/QgYAV - সর্বাধিক সাধারণ উপায়ে একটি মাপদণ্ড
এসেসেপনেটস্কেপ

39
টিএল; ডিআর - অ্যারে। ইএস 5 (আরআর) ইএস 5 এর পর থেকে; এবং $। jQuery এ isArray (এআর)
ওন্দ্র ŽiŽka

6
কেবল মনে রাখবেন যে আপনি যদি কোনও কারণে প্রোটোটাইপের মাধ্যমে আপনার কনস্ট্রাক্টরকে ওভাররাইট করেন তবে arr.constructor === Arrayপরীক্ষাটি মিথ্যা হয়ে যাবে। Array.isArray(arr)এখনও সত্য ফিরে।
ghaschel

উত্তর:


974

আধুনিক ব্রাউজারগুলিতে আপনি এটি করতে পারেন

Array.isArray(obj)

( ক্রোম 5, ফায়ারফক্স 4.0, আই 9, অপেরা 10.5 এবং সাফারি 5 দ্বারা সমর্থিত )

পিছনের সামঞ্জস্যের জন্য আপনি নিম্নলিখিতটি যুক্ত করতে পারেন

# 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

9
ব্রাউজারগুলি সমর্থন করে এমন আরও একটি সম্পূর্ণ তালিকা এখানে রয়েছেArray.isArray
লাইটউইচ05

if (typeof Array.isArray === 'undefined') {পরিবর্তিত হতে পারেif(!Array.isArray) {
iMatoria

কিসের জন্য এটির মূল্য Object.prototype.string.call(obj)হ'ল ছদ্মবেশী করা যায় যদি বস্তুর Symbol.toStringTagএটি থাকে। এটি বলেছিল যে আমি যে কোনও পরিবেশের চালনা করি সে সম্পর্কে আমি অবগত নই Symbol.toStringTagতবে এটি Array.isArrayনিরাপদ বলে মনে হয় না ।
বেনিয়ামিন গ্রুইনবাউম

5
instanceof Arrayঅ্যারেটি যদি অন্য ফ্রেম থেকে আসে তবে কেন ব্যর্থ হবে?
NobleUplift

16
@ নোবেলপ্লিফ্ট: instanceof Arrayঅ্যারেটি যদি অন্য ফ্রেমের থেকে থাকে তবে ব্যর্থ হয় কারণ সেই ভিন্ন ফ্রেমের প্রতিটি অ্যারে আলাদা আলাদা Arrayকনস্ট্রাক্টর এবং প্রোটোটাইপ থাকে। সামঞ্জস্যতা / সুরক্ষার কারণে, প্রতিটি ফ্রেমের নিজস্ব বৈশ্বিক পরিবেশ রয়েছে এবং এর মধ্যে বৈশ্বিক সামগ্রী অন্তর্ভুক্ত রয়েছে। Objectযাতে একটি ফ্রেমে থেকে বিশ্বব্যাপী থেকে ভিন্ন Objectআরেকটি থেকে গ্লোবাল। Arrayগ্লোবালগুলির জন্যও তাই । এক্সেল রাউশ্মায়ার এই সম্পর্কে আরও কথা বলেন
jschoi

1943

ইসমেরাস্ক্রিপ্ট স্ট্যান্ডার্ডে অবজেক্টের শ্রেণি সন্ধানের জন্য দেওয়া পদ্ধতিটি হ'ল toStringপদ্ধতিটি ব্যবহার করা Object.prototype

if( Object.prototype.toString.call( someVar ) === '[object Array]' ) {
    alert( 'Array!' );
}

অথবা আপনি typeofএটি পরীক্ষা করতে ব্যবহার করতে পারেন এটি যদি স্ট্রিং হয়:

if( typeof someVar === 'string' ) {
    someVar = [ someVar ];
}

বা আপনি যদি কর্মক্ষমতা সম্পর্কে উদ্বিগ্ন না হন তবে আপনি কেবল concatএকটি নতুন খালি অ্যারে করতে পারেন do

someVar = [].concat( someVar );

এখানে এমন কনস্ট্রাক্টর রয়েছে যা আপনি সরাসরি জিজ্ঞাসা করতে পারেন:

if (somevar.constructor.name == "Array") {
    // do something
}

নীচে তাঁর মন্তব্যে পোস্ট করা হয়েছে, @ টিজে ক্রাউডারের ব্লগ থেকে একটি সম্পূর্ণ চিকিত্সা দেখুন।

কোন পদ্ধতিটি আরও ভাল সম্পাদন করে তার ধারণা পেতে এই মানদণ্ডটি দেখুন : http://jsben.ch/#/QgYAV

@ ভারত থেকে জিজ্ঞাসিত প্রশ্নের জন্য এস using ব্যবহার করে স্ট্রিংকে অ্যারে রূপান্তর করুন:

const convertStringToArray = (object) => {
   return (typeof object === 'string') ? Array(object) : object 
}

অনুমান করা:

let m = 'bla'
let n = ['bla','Meow']
let y = convertStringToArray(m)
let z = convertStringToArray(n)
console.log('check y: '+JSON.stringify(y)) . // check y: ['bla']
console.log('check y: '+JSON.stringify(z)) . // check y: ['bla','Meow']

65
+1 হ্যাঁ, toStringযাওয়ার অন্যতম উপায়। আমি এখানে কিছুটা রাউন্ডআপ করি: blog.niftysnippets.org/2010/09/say- কিটা html
টিজে ক্রাউডার

3
typeof new String('beans') > 'অবজেক্ট'
বেন

16
আপনি যদি "[অবজেক্ট অ্যারে]" টাইপ করতে না চান তবে অবজেক্ট.প্রোটোটাইপ.টোস্ট্রিং.কম (কিছুVar) === অবজেক্ট.প্রোটোটাইপ.টো স্ট্রিং.সিএল ([]) ব্যবহার করুন বা আপনি যদি ডন না করেন তবে টাইপ পেতে একটি সুবিধাজনক ফাংশন তৈরি করুন 'অবজেক্ট.প্রোটোটাইপ.টোস্ট্রিং.কম টাইপ করতে চান না
প্রমোদ

13
আমি ভ্যানিলা অ্যারে ব্যবহার করি A এবং পুরানো ব্রাউজার সমর্থনের জন্য MDN বিকাশকারী
ডেভিড গিলবার্টসন

21
আধুনিক বিশ্বে লাইভ -Array.isArray(obj)
এমসিএফিডার

1273

আপনার প্রয়োগ বাস্তবায়ন সমর্থন করে কিনা তা আমি প্রথমে যাচাই করব isArray:

if (Array.isArray)
    return Array.isArray(v);

আপনি instanceofঅপারেটরটি ব্যবহার করে দেখতেও চেষ্টা করতে পারেন

v instanceof Array

127
v instanceof Arrayvঅন্য ফ্রেমে তৈরি করা হলে মিথ্যা ফেরত আসবে ( শ্রেণীর vউদাহরণ thatFrame.contentWindow.Array)।
পেপকিন ৮

47
নির্দিষ্ট হতে: Array.isArrayECMAScript 5 / জাভাস্ক্রিপ্ট 1.8.5 অংশ হিসাবে সংজ্ঞায়িত করা হয়।
jevon

8
সত্যিই সহজ এবং ঝরঝরে সমাধান তবে অ্যারে কিছু পুরানো ব্রাউজারগুলির সাথে সামঞ্জস্য নয় (প্রাক্তন আই 7 এবং আই 8)। সূত্র: kangax.github.io/es5-compat-table/#
Wookie88

2
কীভাবে: যদি (অ্যারে.আইআরআরে) Array.isArray (v) ফেরত দেয়; অন্যথায় ভি উদাহরণ হিসাবে অ্যারে;
লুদেব

1
বা কেবল:return (Array.isArray && Array.isArray(v)) || (v instanceof Array);
স্টিজন ডি উইট

298

jQuery একটি $.isArray()পদ্ধতিও সরবরাহ করে:

var a = ["A", "AA", "AAA"];

if($.isArray(a)) {
  alert("a is an array!");
} else {
  alert("a is not an array!");
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


27
কেবল একটি নোট, jQuery অভ্যন্তরীণভাবে টস স্ট্রিং পদ্ধতি ব্যবহার করে: গিটহাব উত্স
জ্যাকব স্কুইয়ার্স

5
@ জ্যাকবস্কয়ার এটি নির্ভর করে। আমি এখানেই পরীক্ষা করেছি, Chrome এ সর্বশেষ jQuery - $.isArray === Array.isArrayসত্য ফিরে আসছে।
রেনান

3
@ রেনান: এটি jQuery ব্যবহার সম্পর্কে ভাল জিনিস। এটি সাধারণত এটি করার জন্য সর্বাধিক আধুনিক এবং সর্বোত্তম পদ্ধতি ব্যবহার করে এবং কী ব্যবহার করবেন তা জানার জন্য আপনাকে নিজেকে সমস্ত বৈশিষ্ট্য পরীক্ষা করতে হবে না।
অবাক

jQuery ব্যবহার করা হয় Array.isArrayলোকচক্ষুর অন্তরালে: github.com/jquery/jquery/blob/master/src/core.js#L211
Sergiu

1
তবে কেউ এই কার্যকারিতার জন্য jQuery JUST ব্যবহার করছেন না, তাই না? আমি শুধু jquery ডাউনলোড করব না কারণ আমি যাচাই করতে চাই যে কিছু অ্যারে আছে কিনা: পি
অটোমাগিস

105

এটি সমস্ত পদ্ধতির মধ্যে দ্রুত (সমস্ত ব্রাউজার সমর্থিত):

function isArray(obj){
    return !!obj && obj.constructor === Array;
}

2
আপনি ঠিক বলেছেন, আমি প্রশ্নে অন্তর্ভুক্ত পরীক্ষাগুলি অনুসারে এটি দ্রুততম।
এমপেন

5
এই পদ্ধতিটি ব্যবহার করার জন্য কোনও ডাউনসাইড রয়েছে? এটি গ্রহণযোগ্য, শীর্ষ উত্তরের চেয়ে অনেক বেশি সহজ এবং কার্যকর বলে মনে হচ্ছে।
ডেভিড মেজা

@ শিনোবি - কেবল কৌতূহলী (এবং আমি এটি প্রায়শই দেখেছি) - আপনি এই শর্তটির if (obj && Array === obj.constructor)বিরোধিতা হিসাবে কেন করেন if (obj && obj.constructor === Array)? এটি কি ইংরেজিতে অনুবাদে হারিয়ে গেছে, তারপরে কোড আইটেমে? উদাহরণস্বরূপ, ইংলিশ স্পিকাররা সাধারণত জিজ্ঞাসা করতে থাকে "কি বস্তুটি বিদ্যমান, এবং এটির নির্মাতা কী অ্যারে শ্রেণি থেকে এসেছেন?", সুতরাং কোডটি পড়ার সময় এটি আরও যুক্তিযুক্ত। বা কিছু প্রযুক্তিগত কারণ আছে?
unsynchronized

function object_type(o){var t = typeof(o);return ((t==="object") && (o.constructor===Array)) ? "array" : t;} /*allows you to */ switch(object_type(o)){ case 'array': break; case 'object' : o.dosomething();}
সিঙ্ক অবিচ্ছিন্ন

3
@ সিনোবি সব ঠিক আছে। আমি মনে করি এটি নিরাপদ সি অভ্যাস থেকে একটি হ্যাংওভার হতে পারে - আপনি যদি ঘটনাক্রমে = পরিবর্তে == ব্যবহার করেন তবে এটি একটি কার্যযোগ্য ভেরিয়েবল হিসাবে সংকলন করবে না।
yn:

47

আপনার নীচে এই অ্যারে রয়েছে তা কল্পনা করুন :

var arr = [1,2,3,4,5];

জাভাস্ক্রিপ্ট (নতুন এবং পুরানো ব্রাউজারগুলি):

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

অথবা

function isArray(arr) {
  return arr instanceof Array;
}

অথবা

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

তারপরে এটিকে কল করুন:

isArray(arr);

জাভাস্ক্রিপ্ট (IE9 +, Ch5 +, FF4 +, সাফ 5 +, অপেরা 10.5 +)

Array.isArray(arr);

JQuery:

$.isArray(arr);

কৌণিক:

angular.isArray(arr);

ইন্ডস্কোর এবং লোডাশ:

_.isArray(arr);

34

অ্যারে.আইসআরারি দ্রুত কাজ করে, তবে এটি ব্রাউজারের সমস্ত সংস্করণ দ্বারা সমর্থিত নয়। সুতরাং আপনি অন্যদের জন্য ব্যতিক্রম করতে পারেন এবং সর্বজনীন পদ্ধতি ব্যবহার করতে পারেন:

    Utils = {};    
    Utils.isArray = ('isArray' in Array) ? 
        Array.isArray : 
        function (value) {
            return Object.prototype.toString.call(value) === '[object Array]';
        }

3
আপনার .toString()কাছ থেকে পদ্ধতিটি নেওয়া দরকার Object.prototype। এই মুহূর্তে আপনি ব্যবহার করছেন window.toString(), যা একই নয়।
সিস্টেম

তুমি ঠিক. ঠিক ক্রোমের window.toStringমতোই করুন Object.prototype.toString
ক্রুরভল্ট

isArray মোটেও দ্রুত নয়। এটি সবচেয়ে ধীর পদ্ধতি।
জিমিলোই

কেন এটি ইউটিলের চেয়ে অ্যারে যুক্ত করবেন না? (আমি জানি যে আপনি নতুন অ্যারে অবজেক্টগুলিতে অতিরিক্ত সম্পত্তি চান না তবে আমি মনে করি যে কেবলমাত্র আপনি অ্যারে.প্রোটোটাইপটিতে অ্যারে যুক্ত করলেই ঘটবে))
ডেভিড

27

এটি পরীক্ষা করার জন্য সহজ ফাংশন:

function isArray(object)
{
    return object.constructor === Array;
}

16
আমি এটিকে এক লাইনে হ্রাস করব return object.constructor === Array- তবে আপনি কি নিশ্চিত যে এটি কেবল অ্যারেগুলিতেই সত্য আসবে?
এমপেন

12
সমস্ত বুলিয়ান এক্সপ্রেশন দিয়ে এটি করতে পারেন। আমি যখন দেখি তখন আমাকে বাদাম if(x) return true; else return falseচালায় :-) এটি পিছনের দিকে হলেও আপনার অভিব্যক্তিটি অস্বীকার করা উচিত।
এমপেন

3
এলিমেটস বাইট্যাগনামের জন্য এটি সত্য না ফেরার কারণ, কারণ সেই ফাংশনের ফলাফলটি আসলে একটি এইচটিএমএল সংগ্রহ এবং একটি অ্যারে নয়।
যুবাল এ।

6
এটি খারাপভাবে ব্যর্থ হয় যদি অবজেক্টটি অনির্ধারিত বা নাল হয়।
জন হেন্কেল

1
@JohnHenckel আমার উত্তর দেখুন stackoverflow.com/a/29400289/34806 এটা একাউন্টে উভয় আপনার উদ্বেগ পাশাপাশি প্রথম মন্তব্য হিসাবে, লাগে সব এক লাইনে
Dexygen

17

এমডিএন যেমন এখানে বলেছে :

ব্যবহার Array.isArray বা Object.prototype.toString.call অ্যারে থেকে নিয়মিত বস্তু পার্থক্য

এটার মত:

  • Object.prototype.toString.call(arr) === '[object Array]', বা

  • Array.isArray(arr)


17

এই প্রশ্নের জন্য কেবল একটি লাইন সমাধান রয়েছে

x instanceof Array

যেখানে এক্সটি পরিবর্তনশীল এটি এক্সটি অ্যারে এবং মিথ্যা যদি না হয় তবে এটি সত্য হবে।


অনেক ক্লিনার এবং ভবিষ্যতের নিরাপদ! এই বা একটি typeofতুলনা।
ক্রিস্টোকিভি

এটি কি এমন কিছু যা ব্রাউজারের ভাল পরিমাণ সমর্থন পায়? আমি এটা পছন্দ করি.
ড্যান জুজেভিচ

1
দুর্ভাগ্যক্রমে, চেষ্টা / ধরা ছাড়াই এটি আসলে কার্যকর নয় কারণ যদি "x" কোনও অ্যারের মতো কোনও বস্তু হয়{} তবে আপনি একটি বাক্য গঠন ত্রুটি পান।
অ্যাবাল্টার

15

আপনার ভেরিয়েবলের ধরণটি এটির সাথে অ্যারে কিনা তা পরীক্ষা করতে পারেন;

var myArray=[];

if(myArray instanceof Array)
{
....
}

1
কিছু লোক ইতিমধ্যে উল্লেখ করেছে instanceof.. আমার মনে হয় এটি কয়েকটি অদ্ভুত পরিস্থিতিতে ব্যর্থ।
এমপেন

15

আপনি যে ধরণের অবজেক্টের সাথে व्यवहार করছেন তা পরীক্ষা করার জন্য আমি একটি ফাংশন করব ...

function whatAmI(me){ return Object.prototype.toString.call(me).split(/\W/)[2]; }

// tests
console.log(
  whatAmI(["aiming","@"]),
  whatAmI({living:4,breathing:4}),
  whatAmI(function(ing){ return ing+" to the global window" }),
  whatAmI("going to do with you?")
);

// output: Array Object Function String

তাহলে আপনি যদি বিবৃতিতে একটি সহজ লিখতে পারেন ...

if(whatAmI(myVar) === "Array"){
    // do array stuff
} else { // could also check `if(whatAmI(myVar) === "String")` here to be sure
    // do string stuff
}

12

আমি খুব সাধারণ উপায়ে এটি করি। আমার জন্য কাজ কর. কোন ত্রুটি?

Array.prototype.isArray = true;

a=[]; b={};
a.isArray  // true
b.isArray  // (undefined -> false)

7
দ্বারা বোকা{isArray:true}
বার্গি

JSON.parse(someDataFromElsewhere).items.isArrayসত্য (ডেটার উপর নির্ভর করে) ফিরে আসতে পারে এবং আপনার কোড ভঙ্গ করতে পারে।
রায় টিঙ্কার

12

মন্তব্যগুলি আমলে নিয়ে এই উত্তরটির উন্নতি করার এটি আমার প্রচেষ্টা attempt

var isArray = myArray && myArray.constructor === Array;

এটি যদি / অন্যটি থেকে মুক্তি পায় এবং অ্যারের নাল বা অপরিজ্ঞাত হওয়ার সম্ভাবনা থাকে for


কনস্ট্রাক্টর
ইএস


11

আমি দুটি বিকল্প পদ্ধতির পাশাপাশি ত্রুটি যাচাইয়ের সাথে জেএসপিফার ফিডল আপডেট করেছি ।

দেখা যাচ্ছে যে 'অবজেক্ট' এবং 'অ্যারে' প্রোটোটাইপগুলিতে ধ্রুবক মান নির্ধারণকারী পদ্ধতিটি অন্যান্য পদ্ধতির যে কোনওটির চেয়ে দ্রুত। এটি কিছুটা অবাক করা ফলাফল।

/* Initialisation */
Object.prototype.isArray = function() {
  return false;
};
Array.prototype.isArray = function() {
  return true;
};
Object.prototype._isArray = false;
Array.prototype._isArray = true;

var arr = ["1", "2"];
var noarr = "1";

/* Method 1 (function) */
if (arr.isArray()) document.write("arr is an array according to function<br/>");
if (!noarr.isArray()) document.write("noarr is not an array according to function<br/>");
/* Method 2 (value) - **** FASTEST ***** */
if (arr._isArray) document.write("arr is an array according to member value<br/>");
if (!noarr._isArray) document.write("noarr is not an array according to member value<br/>");

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


9

আমি জানি, লোকেরা কোনও ধরণের কাঁচা জাভাস্ক্রিপ্ট পদ্ধতির সন্ধান করছে। তবে আপনি যদি কম চিন্তা করতে চান তবে এখানে একবার দেখুন: http://underscorejs.org/#isArray

_.isArray(object) 

যদি বস্তুটি একটি অ্যারে হয় তবে সত্যটি ফেরত দেয়।

(function(){ return _.isArray(arguments); })();
=> false
_.isArray([1,2,3]);
=> true

7
"যদি কোনও ফ্রেমওয়ার্ক / লাইব্রেরির জন্য অন্য ট্যাগটিও অন্তর্ভুক্ত না করা হয় তবে খাঁটি জাভাস্ক্রিপ্টের উত্তর আশা করা যায়।"
মিশা পেরেকোভস্কি

5

আমি যে সেরা সমাধানটি দেখেছি তা হ'ল টাইপের জন্য ক্রস ব্রাউজার প্রতিস্থাপন। অ্যাঙ্গাস ক্রোলের সমাধানটি এখানে দেখুন

টিএল; ডিআর সংস্করণটি নীচে রয়েছে, তবে নিবন্ধটি ইস্যুটির একটি দুর্দান্ত আলোচনা তাই আপনার সময় থাকলে এটি পড়া উচিত read

Object.toType = function(obj) {
    return ({}).toString.call(obj).match(/\s([a-z|A-Z]+)/)[1].toLowerCase();
}
// ... and usage:
Object.toType([1,2,3]); //"array" (all browsers)

// or to test...
var shouldBeAnArray = [1,2,3];
if(Object.toType(shouldBeAnArray) === 'array'){/* do stuff */};

5

এখানে আমার অলস উপায়:

if (Array.prototype.array_ === undefined) {
  Array.prototype.array_ = true;
}

// ...

var test = [],
    wat = {};

console.log(test.array_ === true); // true
console.log(wat.array_ === true);  // false

আমি জানি এটি প্রোটোটাইপটির সাথে "জগাখিচুড়ি" করাটিকে ত্যাগ করা, তবে এটি প্রস্তাবিত toStringপদ্ধতির চেয়ে উল্লেখযোগ্যভাবে আরও ভাল পারফর্ম করে বলে মনে হচ্ছে

দ্রষ্টব্য: এই পদ্ধতির একটি ক্ষতি হ'ল এটি সীমানা পেরিয়ে কাজiframe করবে না , তবে আমার ব্যবহারের ক্ষেত্রে এটি কোনও সমস্যা নয়।


এটি আর পারফরম্যান্সের ক্ষেত্রে আরও ভাল নয়, কমপক্ষে FF30 এ উবুন্টুতে 64-বিট
টেস্ট 30

2
wat = {array_: true}বস্তু দ্বারা বোকা ।
বার্গি

@ বার্গি: হ্যাঁ, এটি সুস্পষ্ট হওয়া উচিত। যদি আপনি সেট করে থাকেন obj.array_ = trueতবে আপনি কেবল নিজেকে বোকা বানাচ্ছেন
নমুউল

@ নামুয়াল: আমি অগত্যা নিজেকে বোকা বানাচ্ছি না। প্রায়শই পর্যাপ্ত বস্তু অভিধান হিসাবে ব্যবহৃত হয়। একটি চিন্তা cacheযা সম্পত্তি কী হিসেবে সার্চ স্ট্রিং ব্যবহার সন্ধানের ফলাফলের memoize করার অবজেক্ট। যদি কোনও ব্যবহারকারী অনুসন্ধান করে array_? আপনার বস্তু কি এজন্য একটি অ্যারে হয়ে যায়? এটা ঠিক একটি বাগ।
বার্গি

@ নানুওল: এছাড়াও, এই পদ্ধতির জন্য সমস্ত জড়িত পক্ষগুলি (ব্যবহৃত গ্রন্থাগারগুলি সহ) সম্মতি জানাতে হবে যা .array_অ্যারে ট্যাগিংয়ের জন্য ব্যবহৃত হয়। এটি এখানে সত্যিই ঘটনা নয়, .arrayকোনও অর্থ বোঝাতে পারে। আপনার কমপক্ষে একটি বর্ণনামূলক স্ট্রিং ব্যবহার করা উচিত এবং স্বেচ্ছাসেবী ব্যবহারের অনুপযুক্তি যেমন, এর সাথে .__isArray = true
বার্গি

5

স্টোয়ান স্টেফানোভের বই জাভাস্ক্রিপ্ট প্যাটার্নসে একটি দুর্দান্ত উদাহরণ রয়েছে যা মনে করে যে সমস্ত সম্ভাব্য সমস্যাগুলি পরিচালনা করার পাশাপাশি ECMAScript 5 পদ্ধতি অ্যারে.আইস অ্যারে () ব্যবহার করতে পারে

সুতরাং এটি এখানে:

if (typeof Array.isArray === "undefined") {
    Array.isArray = function (arg) {
        return Object.prototype.toString.call(arg) === "[object Array]";
    };
}

যাইহোক, আপনি jQuery ব্যবহার করে থাকেন তবে আপনি এটির পদ্ধতিটি ব্যবহার করতে পারেন is .আইআররে ()


2
+1: কেন কেবল সরল নয় if(!Array.isArray) {...?
মার্কো ডেমাইও

5

কোনও অবজেক্ট অ্যারে কিনা তা যাচাই করার সহজ ও দ্রুততম উপায়।

 var arr = [];
  arr.constructor.name ==='Array'  //return true;

অথবা

arr.constructor ===Array //return true;

অথবা আপনি একটি ইউটিলিটি ফাংশন করতে পারেন:

function isArray(obj){ return obj && obj.constructor ===Array}

ব্যবহার:

isArray(arr); //return true

5

নিম্নলিখিতটি ব্যবহার করা যেতে পারে যদি আপনি জানেন যে আপনার অবজেক্টে কোন কনক্যাট পদ্ধতি নেই।

var arr = [];
if (typeof arr.concat === 'function') {
    console.log("It's an array");
}


এটি একটি ভাল কৌশল, তবে ওভাররাইড করা যেতে পারে ... তবে বেশিরভাগ সময় ফলাফল পাওয়া উচিত
আলিরিজা

5

আপনি isArray পদ্ধতি হতে পারে তবে আমি চেক করতে পছন্দ করব

Object.getPrototypeOf(yourvariable) === Array.prototype


আপনি এটাকে কেন পছন্দ করবেন?
এমপেন

@ স্পেন Object.getPrototypeOf(yourvariable)এটি একটি অ্যারে অবজেক্টের প্রোটোটাইপ প্রদান করে। এবং কোডটি দ্রুত এবং নির্ভর করতে নিরাপদ।
স্টিল

1
এটি বানানো সহজ: পেস্টবিন.com / এমপি 8 ডি 5 বি সি ই এছাড়াও, আপনার "দ্রুততম" দাবিটি ব্যাক আপ করার জন্য আপনার কি পারফরম্যান্স টেস্ট রয়েছে?
এমপেন

4

এই ফাংশনটিতে কেবলমাত্র দুটি ধরণের মানগুলি যদি স্ট্রিং বা স্ট্রিংগুলির একটি অ্যারে হয় তবে এটিকে সহজ রাখুন এবং typeofস্ট্রিং সম্ভাবনার জন্য একটি চেক ব্যবহার করুন:

function someFunc(arg) {
    var arr = (typeof arg == "string") ? [arg] : arg;
}

হ্যাঁ ... এটি এই দৃশ্যের জন্য কাজ করবে তবে সাধারণভাবে নয়। যাইহোক যাইহোক Varargs ব্যবহার করে শেষ। :)
এমপেন

4
A = [1,2,3]
console.log(A.map==[].map)

সংক্ষিপ্ত সংস্করণটির সন্ধানে আমি এ পর্যন্ত পেয়েছি।

দ্রষ্টব্য, এমন কোনও নিখুঁত ফাংশন নেই যা সর্বদা সম্ভাব্য সংমিশ্রণগুলি সনাক্ত করে। যাদু সরঞ্জামের প্রত্যাশার চেয়ে আপনার সরঞ্জামগুলির সমস্ত দক্ষতা এবং সীমাবদ্ধতাগুলি জানা ভাল।


1
আমার কিছুটা ব্যয় A.map !== undefinedকিন্তু হ্যাঁ, এটি বানর প্যাচারদের বিশ্বে পিচ্ছিল রাস্তা হতে পারে;)
dmi3y

অবগতির জন্য এই iFrames জুড়ে কাজ করে না ( stackoverflow.com/questions/460256/... )
WiredPrairie

4
function isArray(value) {
    if (value) {
        if (typeof value === 'object') {
            return (Object.prototype.toString.call(value) == '[object Array]')
        }
    }
    return false;
}

var ar = ["ff","tt"]
alert(isArray(ar))

4

যদি ইনপুট মানটি অ্যারে হয় তবে পরীক্ষার জন্য একটি সাধারণ ফাংশন নিম্নলিখিত:

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

এটি ক্রস ব্রাউজার এবং পুরানো ব্রাউজারগুলির সাথে কাজ করে। এটি টিজে ক্রাউডারের ব্লগ পোস্ট থেকে টানা হয়েছে


4

আপনি এটি চেষ্টা করতে পারেন:

var arr = []; (or) arr = new Array();
var obj = {}; (or) arr = new Object();

arr.constructor.prototype.hasOwnProperty('push') //true

obj.constructor.prototype.hasOwnProperty('push') // false

4

এই ফাংশনটি প্রায় কোনও কিছুকে অ্যারেতে পরিণত করবে:

function arr(x) {
    if(x === null || x === undefined) {
        return [];
    }
    if(Array.isArray(x)) {
        return x;
    }
    if(isString(x) || isNumber(x)) {
        return [x];
    }
    if(x[Symbol.iterator] !== undefined || x.length !== undefined) {
        return Array.from(x);
    }
    return [x];
}

function isString(x) {
    return Object.prototype.toString.call(x) === "[object String]"
}

function isNumber(x) {
    return Object.prototype.toString.call(x) === "[object Number]"
}

এটি কয়েকটি নতুন ব্রাউজার বৈশিষ্ট্য ব্যবহার করে যাতে আপনি সর্বাধিক সমর্থনের জন্য এটি পলিফিল করতে পারেন।

উদাহরণ:

> arr(null);
[]
> arr(undefined)
[]
> arr(3.14)
[ 3.14 ]
> arr(1/0)
[ Infinity ]
> gen = function*() { yield 1; yield 2; yield 3; }
[Function: gen]
> arr(gen())
[ 1, 2, 3 ]
> arr([4,5,6])
[ 4, 5, 6 ]
> arr("foo")
[ 'foo' ]

এনবি স্ট্রিংগুলি অক্ষরের অ্যারের পরিবর্তে একক উপাদানের সাথে অ্যারেতে রূপান্তরিত হবে। isStringআপনি যদি অন্যভাবে এটি পছন্দ করেন তবে চেকটি মুছুন ।

আমি Array.isArrayএখানে ব্যবহার করেছি কারণ এটি সবচেয়ে শক্তিশালী এবং সহজতমও।


4

আপনার ক্ষেত্রে আপনি অ্যারেরconcat পদ্ধতি ব্যবহার করতে পারেন যা একক বস্তুর পাশাপাশি অ্যারের (এবং এমনকি সংযুক্ত) গ্রহণ করতে পারে:

function myFunc(stringOrArray)
{
  var arr = [].concat(stringOrArray);

  console.log(arr);

  arr.forEach(function(item, i)
  {
    console.log(i, "=", item);
  })
}

myFunc("one string");

myFunc(["one string", "second", "third"]);

concat অ্যারের প্রাচীনতম পদ্ধতিগুলির মধ্যে একটি বলে মনে হচ্ছে (এমনকি আই 5.5 এছাড়াও এটি ভাল করে জানে)।

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