වස්තුවක් අරාවක් දැයි පරීක්ෂා කරන්නේ කෙසේද?


2764

මම උත්සාහ කරන්නේ එක්කෝ නූල් ලැයිස්තුවක් හෝ තනි නූලක් පිළිගන්නා ශ්‍රිතයක් ලිවීමට ය. එය නූලක් නම්, එක් අයිතමයක් සමඟ එය අරාවකට පරිවර්තනය කිරීමට මට අවශ්‍යය, එබැවින් දෝෂයකට බිය නොවී මට එය උඩින් ලූප කළ හැකිය.

විචල්‍යය අරාවක් දැයි මා පරීක්ෂා කරන්නේ කෙසේද?


මම පහත විවිධ විසඳුම් සකස් කර jsperf පරීක්ෂණයක් නිර්මාණය කර ඇත්තෙමි . ඒවා සියල්ලම වේගවත් ය, එබැවින් භාවිතා කරන්න Array.isArray- එය දැන් හොඳින් සහාය වන අතර රාමු හරහා ක්‍රියා කරයි .


6
මම සිතුවේ ඔබ අදහස් කළේ 'වස්තුව අරාවක් දැයි පරීක්ෂා කරන්න', නමුත් ඔබට අවශ්‍ය වන්නේ 'වස්තුව යනු නූල් මාලාවක්ද නැතිනම් තනි නූලක්ද' යන්නයි. ඔබ එය දුටුවහොත් විශ්වාස නැද්ද? නැත්නම් එය මා පමණක්ද? මම හිතුවේ මේ වගේ තවත් දෙයක් ගැන ... මම මෙහි යමක් නැතිවූවාද?
rr1g0

149
TL; DR - arr.constructor === Arrayවේගවත්ම වේ.
නෙටා

3
jsben.ch/#/QgYAV - වඩාත් පොදු ක්‍රම සඳහා මිණුම් ලකුණක්
EscapeNetscape

39
ටීඑල්; ඩීආර් - අරාව. ES5 සිට isArray (arr) ; සහ $. jQuery හි isArray (arr) .
Ondra Žižka

6
ඔබ කිසියම් හේතුවක් නිසා ඔබේ ඉදිකිරීම්කරු මූලාකෘති හරහා නැවත ලිවුවහොත් එම arr.constructor === Arrayපරීක්ෂණය අසත්‍ය බව මතක තබා ගන්න. Array.isArray(arr)තවමත් සත්‍ය වේ.
ghaschel

Answers:


993

නවීන බ්‍රව්සර් වලදී ඔබට කළ හැකිය

Array.isArray(obj)

( සහාය ක්රෝම් 5, ෆයර්ෆොක්ස් 4.0, IE 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
lightswitch05

if (typeof Array.isArray === 'undefined') {වෙනස් කළ හැකිif(!Array.isArray) {
iMatoria

මක්නිසාද යත් එය වටින දෙය Object.prototype.string.call(obj)වස්තුව Symbol.toStringTagමත තිබේ නම් එය නරක් කළ හැකිය . එයින් කියැවෙන්නේ නැව්ගත කරන කිසිදු පරිසරයක් ගැන මා නොදන්නා Symbol.toStringTagනමුත් Array.isArrayමෙය ආරක්ෂිත බවක් නොපෙනේ .
බෙන්ජමින් ග ru න්බෝම්

5
instanceof Arrayඅරාව වෙනත් රාමුවකින් නම් අසමත් වන්නේ ඇයි ?
NobleUplift

16
ObleNobleUplift: instanceof Arrayඅරාව වෙනත් රාමුවකින් නම් අසමත් වේ, මන්ද එම විවිධ රාමුවේ සෑම අරාවකටම වෙනස් Arrayඉදිකිරීම් සහ මූලාකෘති ඇත. අනුකූලතා / ආරක්ෂක හේතූන් මත, සෑම රාමුවකටම තමන්ගේම ගෝලීය පරිසරයක් ඇති අතර මෙයට ගෝලීය වස්තු ඇතුළත් වේ. මෙම Objectඑක් රාමුවක් සිට ගෝලීය සිට වෙනස් වේ Objectසිට තවත් ගෝලීය. Arrayග්ලෝබල් සඳහාද එසේමය. ඇක්සෙල් රවුෂ්මයර් මේ ගැන වැඩි විස්තර කතා කරයි .
jschoi

1945

වස්තුවේ පන්තිය සොයා ගැනීම සඳහා ECMAScript ප්‍රමිතියෙන් ලබා දී ඇති toStringක්‍රමය නම් ක්‍රමය භාවිතා කිරීමයි Object.prototype.

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

නැතහොත් typeofඑය නූලක් දැයි පරීක්ෂා කිරීමට ඔබට භාවිතා කළ හැකිය :

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

නැතහොත් ඔබ කාර්ය සාධනය ගැන තැකීමක් නොකරන්නේ නම්, ඔබට concatනව හිස් අරාවකට කළ හැකිය.

someVar = [].concat( someVar );

ඔබට කෙලින්ම විමසිය හැකි ඉදිකිරීම්කරු ද ඇත:

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

JTJ Crowder's වෙතින් සම්පූර්ණ ප්‍රතිකාරයක් බලන්න පහත ප්රකාශනය කින් පල ලෙස, බ්ලොග්.

වඩා හොඳ වන්නේ කුමන ක්‍රමයද යන්න පිළිබඳ අදහසක් ලබා ගැනීමට මෙම මිණුම් ලකුණ බලන්න : http://jsben.ch/#/QgYAV

Hara භාරත් වෙතින් ඇසූ ප්‍රශ්නය සඳහා Es6 භාවිතා කරමින් නූල් අරාව බවට පරිවර්තනය කරන්න:

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යා යුතු එක් ක්‍රමයකි. මම මෙහි සුළු වටපිටාවක් කරමි
ටී. ජේ. ක්‍රෝඩර්

3
typeof new String('beans') > 'වස්තුව'
බෙන්

16
ඔබට "[වස්තු අරාව]" ටයිප් කිරීමට අවශ්‍ය නැතිනම් Object.prototype.toString.call (someVar) === Object.prototype.toString.call ([]) භාවිතා කරන්න. Object.prototype.toString.call ටයිප් කිරීමට මට අවශ්‍ය නැත
ප්‍රමෝද්

13
මම නවීන බ්‍රව්සර්වල (එනම් IE9 + සහ අනෙක් සියල්ලන්ම) ක්‍රියාත්මක වන වැනිලා අරා.අයිස්ආරේ භාවිතා කරමි. හා පැරණි බ්රවුසරයක් සහාය භාවිතය සඳහා MDN සිට සිම් developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
ඩේවිඩ් Gilbertson

21
නූතන ලෝකයේ ජීවත් වන්න -Array.isArray(obj)
mcfedr

1277

ඔබේ ක්‍රියාත්මක කිරීම සඳහා සහය ලැබේදැයි මම පළමුව පරීක්ෂා කරමි isArray:

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

ඔබට instanceofක්‍රියාකරු භාවිතා කිරීමටද උත්සාහ කළ හැකිය

v instanceof Array

127
v instanceof Arrayvවෙනත් රාමුවකින් සාදන ලද්දේ නම් එය අසත්‍ය vවේ ( thatFrame.contentWindow.Arrayපන්තියේ උදාහරණයකි ).
pepkin88

47
නිශ්චිත වීමට: Array.isArrayECMAScript 5 / Javascript 1.8.5 හි කොටසක් ලෙස අර්ථ දක්වා ඇත.
jevon

8
සැබවින්ම සරල හා පිළිවෙලට විසඳුමක් නමුත් සමහර පැරණි බ්‍රව්සර් සමඟ (උදා: IE7 සහ IE8) නොගැලපේ. මුලාශ්‍රය: kangax.github.io/es5-compat-table/#
Wookie88

2
කෙසේද: (Array.isArray) ආපසු Array.isArray (v); වෙනත් ආකාරයකින් ආපසු අරාව;
lewdev

1
හෝ නිකම්ම:return (Array.isArray && Array.isArray(v)) || (v instanceof Array);
ස්ටිජන් ඩි විට්

299

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 අභ්‍යන්තරව toString ක්‍රමය භාවිතා කරයි: GitHub Source
Jacob Squires

5
A ජාකොබ්ස්ක්වයිර්ස් එය රඳා පවතී. මම දැන් මෙහි අත්හදා බැලුවෙමි, ක්‍රෝම් හි නවතම jQuery - $.isArray === Array.isArrayනැවත සත්‍ය වේ.
රෙනන්

3
En රෙනන්: jQuery භාවිතා කිරීම පිළිබඳ හොඳ දෙය මෙයයි. එය සාමාන්‍යයෙන් එය කිරීමට වඩාත්ම නවීන හා හොඳම ක්‍රමය භාවිතා කරන අතර, භාවිතා කළ යුතු දේ දැන ගැනීමට ඔබ විසින්ම පරීක්ෂා කර බලන සියලුම අංගයන් ඔබ විසින් කළ යුතු නොවේ.
විස්ම

jQuery Array.isArrayතිරය ​​පිටුපස භාවිතා කරයි: github.com/jquery/jquery/blob/master/src/core.js#L211
Sergiu

1
නමුත් කිසිවෙකු මෙම ක්‍රියාකාරිත්වය සඳහා jQuery භාවිතා කිරීමට යන්නේ නැත, නේද? යමක් අරාව තිබේදැයි පරීක්ෂා කිරීමට අවශ්‍ය නිසා මම jquery බාගත නොකරමි: p
Automagisch

106

සියලුම ක්‍රම අතර වේගවත්ම වේ (සියලුම බ්‍රව්සර් සඳහා සහය දක්වයි):

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

2
ඔබ හරි, මම ප්‍රශ්නයට ඇතුළත් කළ පරීක්ෂණ අනුව වේගවත්ම වේ.
mpen

5
මෙම ක්‍රමය භාවිතා කිරීමේ අවාසි තිබේද? එය පිළිගත්, ඉහළ පිළිතුරට වඩා සරල හා effective ලදායී බව පෙනේ.
ඩේවිඩ් මීසා

in ෂිනෝබි - කුතුහලයෙන් (මම මෙය බොහෝ විට දැක ඇත්තෙමි) - ඔබ කොන්දේසියට if (obj && Array === obj.constructor)පටහැනි වන්නේ if (obj && obj.constructor === Array)ඇයි? එය ඉංග්‍රීසි භාෂාවට පරිවර්තනය කිරීම නැති වී තිබේද? උදා: ඉංග්‍රීසි කථිකයන් සාමාන්‍යයෙන් "වස්තුව පවතින්නේද, එය සාදන්නා අරාව පන්තියෙන්ද?" යනුවෙන් විමසීමට නැඹුරු වේ, එබැවින් එය කියවීමේදී කේත ප්‍රවාහය වඩාත් තාර්කික වේ. නැත්නම් යම් තාක්ෂණික හේතුවක් තිබේද?
සමමුහුර්ත නොකළ

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
in ෂිනෝබි සියල්ල හොඳයි. මම හිතන්නේ එය ආරක්ෂිත c පුරුද්දක හැන්ගෝවර් එකක් විය හැකිය - ඔබ අහම්බෙන් = ඒ වෙනුවට == භාවිතා කරන්නේ නම්, එය සම්පාදනය කළ නොහැකි විචල්‍යයක් ලෙස සම්පාදනය නොවේ.
සමමුහුර්ත නොකළ

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 +, Saf5 +, Opera10.5 +)

Array.isArray(arr);

jQuery:

$.isArray(arr);

කෝණික:

angular.isArray(arr);

යටි ඉරි සහ ලොඩාෂ්:

_.isArray(arr);

34

Array.isArray වේගයෙන් ක්‍රියා කරයි, නමුත් එයට බ්‍රව්සර් වල සියලුම අනුවාදයන් සහාය නොදක්වයි. එබැවින් ඔබට අන් අයට ව්‍යතිරේකයක් කර විශ්වීය ක්‍රමයක් භාවිතා කළ හැකිය:

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

3
ඔබ .toString()ක්රමය ලබා ගත යුතුය Object.prototype. දැන් ඔබ භාවිතා window.toString()කරන්නේ එයම නොවේ.
පද්ධතිය

ඔයා හරි. Chrome හි window.toStringමෙන් Object.prototype.toStringඑය කරන්න.
CruorVult

isArray කිසිසේත් වේගවත් නොවේ. එය මන්දගාමී ක්‍රමයයි.
jemiloii

යුටිල්ස් වලට වඩා එය අරේ වෙත එකතු නොකරන්නේ ඇයි? (මම දන්නේ ඔබට නව මාලාවක් වස්තූන් මත අමතර ගුණ කැමති නැහැ නමුත් මම ඔබට Array.prototype කිරීමට isArray එකතු නම් පමණක් සිදු කියලා මම හිතනවා.)
ඩේවිඩ් Winiecki

27

මෙය පරීක්ෂා කිරීම සඳහා සරල කාර්යයක්:

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

16
මම එය එක පේළියකට අඩු කරමි return object.constructor === Array- නමුත් මෙය සත්‍ය වන්නේ අරා සඳහා පමණක් බව ඔබට විශ්වාසද?
mpen

12
සියලු බූලියන් ප්‍රකාශන සමඟ එය කළ හැකිය. මා දකින විට මට ගෙඩි if(x) return true; else return falseගසයි :-) එය පසුපසට ගියත්, ඔබ ප්‍රකාශනය ප්‍රතික්ෂේප කළ යුතුය.
mpen

3
GetElementsByTagName සඳහා මෙය සත්‍ය නොවීමට හේතුව, එම ශ්‍රිතයේ ප්‍රති result ලය ඇත්ත වශයෙන්ම HTMLC එකතුවක් මිස අරාව නොවේ.
යුවල් ඒ.

6
වස්තුව නිර්වචනය නොකළ හෝ ශුන්‍ය නම් මෙය නරක ලෙස අසමත් වේ.
ජෝන් හෙන්කල්

1
@ ජෝන් හෙන්කල් මගේ පිළිතුර බලන්න stackoverflow.com/a/29400289/34806 එය ඔබගේ සැලකිල්ල මෙන්ම පළමු ප්‍රකාශය යන දෙකම එක පේළියකින් සැලකිල්ලට ගනී
ඩෙක්සිජන්

17

එම්ඩීඑන් මෙහි පවසන පරිදි :

භාවිතා Array.isArray හෝ Object.prototype.toString.call පෙලගැස්මක් සිට නිත්ය වස්තූන් හඳුනා ගැනීමට

මෙවැනි:

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

  • Array.isArray(arr)


17

මෙම ප්‍රශ්නයට ඇත්තේ එක් පේළියක් පමණි

x instanceof Array

x යනු විචල්‍යය වන විට x යනු අරාව නම් එය සත්‍ය වේ.


බොහෝ පිරිසිදු හා අනාගත සුරක්ෂිතයි! මෙය හෝ typeofසංසන්දනයක්.
ක්‍රිස්ටොකි

මෙය හොඳ බ්‍රව්සර සහය ලබා ගන්නා දෙයක්ද? මම එයට කැමතියි.
ඩෑන් සුසෙවිච්

1
අවාසනාවකට මෙන්, උත්සාහ කිරීම / අල්ලා ගැනීමකින් තොරව මෙය සැබවින්ම ප්‍රයෝජනවත් නොවේ, මන්ද "x" යනු අරාව වැනි වස්තුවක්{} නම්, ඔබට සින්ටැක්ස් දෝෂයක් ලැබෙනු ඇත.
abalter

15

ඔබේ විචල්යයේ වර්ගය එය සමඟ අරාවක් දැයි ඔබට පරීක්ෂා කළ හැකිය;

var myArray=[];

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

1
කිහිප දෙනෙක් දැනටමත් සඳහන් කර ඇත instanceof.. මම හිතන්නේ එය අමුතු අවස්ථා කිහිපයක් යටතේ අසමත් වේ.
mpen

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

අදහස් සැලකිල්ලට ගනිමින් මෙම පිළිතුර වැඩිදියුණු කිරීමට මා ගත් උත්සාහය මෙයයි :

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

එය if / else වලින් ඉවත් වන අතර අරාව ශුන්‍ය හෝ නිර්වචනය නොකිරීමේ හැකියාව සඳහා හේතු වේ


ඉදිකිරීම්කරු ES5
TechTurtle


11

මම jsperf ෆෙඩලය විකල්ප ක්‍රම දෙකකින් මෙන්ම දෝෂ පරීක්ෂා කිරීමෙන් යාවත්කාලීන කර ඇත .

'වස්තුව' සහ 'අරාව' මූලාකෘතිවල නියත අගයක් අර්ථ දක්වන ක්‍රමය අනෙක් ක්‍රමවලට වඩා වේගවත් බව පෙනේ. එය තරමක් පුදුම සහගත ප්‍රති .ලයකි.

/* 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/>");

විචල්‍යය නිර්වචනය නොකළ අගය ගනී නම් මෙම ක්‍රම දෙක ක්‍රියා නොකරයි, නමුත් ඒවාට වටිනාකමක් ඇති බව ඔබට විශ්වාස නම් ඒවා ක්‍රියාත්මක වේ. අගය අරාවක් හෝ තනි අගයක් දැයි කාර්ය සාධනය මනසේ තබාගෙන පරීක්ෂා කිරීම සම්බන්ධයෙන්, දෙවන ක්‍රමය වලංගු වේගවත් ක්‍රමයක් ලෙස පෙනේ. ඉන්ටර්නෙට් එක්ස්ප්ලෝරර්, ඔපෙරා සහ සෆාරි (මගේ යන්ත්‍රයේ) හි දෙවන හොඳම ක්‍රමය මෙන් දෙගුණයක් වේගවත් වන එය ක්‍රෝම් හි 'ඉන්ස්ටෝන්ෆ්' ට වඩා තරමක් වේගවත් ය.


9

මම දන්නවා, මිනිස්සු යම් ආකාරයක අමු ජාවාස්ක්‍රිප්ට් ප්‍රවේශයක් සොයන බව. නමුත් ඔබට අඩුවෙන් සිතීමට අවශ්‍ය නම්, මෙහි බලන්න: http://underscorejs.org/#isArray

_.isArray(object) 

වස්තුව අරා නම් සත්‍ය වේ.

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

7
"රාමුවක් / පුස්තකාලයක් සඳහා තවත් ටැගයක් ඇතුළත් කර නොමැති නම්, පිරිසිදු ජාවාස්ක්‍රිප්ට් පිළිතුරක් අපේක්ෂා කෙරේ."
මයිකල් පෙරකොව්ස්කි

5

මෙම ශ්‍රිතයට ලබා දිය හැකි එකම වර්ග දෙකේ අගයන් නූල් හෝ නූල් සමූහයක් නම්, එය සරලව තබාගෙන typeofනූල් හැකියාව සඳහා චෙක්පතක් භාවිතා කරන්න:

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

ඔව් ... එය මෙම තත්වය සඳහා ක්‍රියා කරයි, නමුත් පොදුවේ නොවේ. කෙසේ හෝ වරග්ස් භාවිතා කර අවසන්. :)
mpen

5

මා දුටු හොඳම විසඳුම යතුරු ලියනය සඳහා හරස් බ්‍රව්සර ආදේශ කිරීමකි. ඇන්ගස් ක්‍රොල්ගේ විසඳුම මෙතැනින් බලන්න .

ටීඑල්; ඩීආර් අනුවාදය පහතින් ඇත, නමුත් ලිපිය ගැටලුව පිළිබඳ විශාල සාකච්ඡාවක් වන බැවින් ඔබට කාලය ඇත්නම් එය කියවිය යුතුය.

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 නම් එය සීමාවන් ඉක්මවා ක්‍රියා නොකිරීමයි, නමුත් මගේ භාවිතය සඳහා මෙය ගැටළුවක් නොවේ.


එය තවදුරටත් කාර්ය සාධනය අනුව වඩා හොඳ නැත, අවම වශයෙන් උබුන්ටු 64-බිට් හි FF30 මත
test30

2
wat = {array_: true}වස්තූන් විසින් රවටනු ලැබේ .
බර්ගි

Er බර්ගි: ඔව්, එය පැහැදිලිව පෙනිය යුතුයි. ඔයා තමයි සැකසුම නම් obj.array_ = true, එවිට ඔබ කරන්නේ තනිවම අවශ්ය තන්හි දී .
namuol

@namuol: මම අනිවාර්යයෙන්ම මාව රවට්ටන්නේ නැහැ. බොහෝ විට ප්‍රමාණවත් වස්තූන් ශබ්ද කෝෂ ලෙස භාවිතා කරයි. cacheදේපල යතුරු ලෙස සෙවුම් නූල් භාවිතා කරන සෙවුම් ප්‍රති results ල මතක තබා ගැනීමට වස්තුවක් ගැන සිතන්න . පරිශීලකයෙකු සොයන්නේ නම් කුමක් කළ array_යුතුද? ඔබේ වස්තුව අරාව බවට පත්වන්නේ ඒ නිසාද? එය දෝෂයකි.
බර්ගි

@namuol: එසේම, මෙම ප්‍රවේශය මඟින් .array_අරා ටැග් කිරීම සඳහා භාවිතා කරන සියලුම සම්බන්ධිත පාර්ශ්වයන්ට (භාවිතා කළ පුස්තකාල ඇතුළුව) එකඟ විය යුතුය. මෙහි ඇත්ත වශයෙන්ම එය එසේ නොවේ, .arrayඕනෑම දෙයක් අදහස් කළ හැකිය. ඔබ අවම වශයෙන් විස්තරාත්මක නූලක් භාවිතා කළ යුතු අතර අත්තනෝමතික භාවිතයේ නුසුදුසුකම සං signal ා කළ යුතුය, උදා .__isArray = true.
බර්ගි

5

ස්ටොයාන් ස්ටෙෆනොව්ගේ ජාවාස්ක්‍රිප්ට් රටා පොතේ හොඳ උදාහරණයක් තිබේ, එය හැකි සෑම ගැටලුවක්ම විසඳා ගැනීමට මෙන්ම ECMAScript 5 ක්‍රමය Array.isArray () භාවිතා කිරීමට උපකාරී වේ. වේ.

ඉතින් මෙන්න එයයි:

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

මාර්ගය වන විට, ඔබ jQuery භාවිතා කරන්නේ නම්, ඔබට එය භාවිතා කළ හැකිය is .isArray ()


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


ඔබ මෙය කැමති ඇයි?
mpen

@mpen Object.getPrototypeOf(yourvariable)එය අරාව වස්තුවක මූලාකෘතිය නැවත ලබා දෙයි. කේතය වේගවත් හා ආරක්ෂිතයි.
ස්ටීල්

1
තීරු දැමීම පහසුය: pastebin.com/MP8d5bCE එසේම, ඔබේ “වේගවත්ම” හිමිකම් පෑම සඳහා ඔබට කාර්ය සාධන පරීක්ෂණ තිබේද?
mpen

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

මෙහි කෙටිම අනුවාදය සෙවීමේදී මට මෙතෙක් ලැබී ඇත්තේ එයයි.

සටහන, හැකි සෑම සංයෝජනයක්ම සෑම විටම හඳුනාගත හැකි පරිපූර්ණ කාර්යයක් නොමැත. මැජික් මෙවලමක් අපේක්ෂා කරනවාට වඩා ඔබේ මෙවලම්වල සියලු හැකියාවන් සහ සීමාවන් දැන ගැනීම වඩා හොඳය.


1
මගේ සුළු ව්‍යුත්පන්නය, A.map !== undefinedඔව්, එය වඳුරු පැච්කරුවන්ගේ ලෝකයේ ලිස්සන මාර්ගයක් විය හැකිය;)
dmi3y

FYI: මෙය 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 අරේ හි පැරණිතම ක්‍රමවලින් එකක් ලෙස පෙනේ (IE 5.5 පවා එය හොඳින් දනී).

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.