javascript على تحقق مما إذا كان الكائن هو مصفوفة؟




امثلة على المصفوفات في الجافا (20)

أسهل وأسرع طريقة للتحقق مما إذا كان الكائن عبارة عن مصفوفة أم لا.

 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

https://code.i-harness.com

أحاول كتابة دالة تقبل إما قائمة من السلاسل أو سلسلة واحدة. إذا كانت سلسلة ، فأنا أريد تحويلها إلى مصفوفة تحتوي على عنصر واحد فقط. ثم استطيع تجاوزها دون خوف من خطأ.

إذن ، كيف أتحقق من أن المتغير هو مصفوفة؟

لقد قمت بتقريب الحلول المختلفة أدناه وقمت بإنشاء اختبار jsperf .


أعلم أن الناس يبحثون عن نوع من نهج جافا سكريبت الخام. ولكن إذا كنت تريد التفكير بشكل أقل ، ألقِ نظرة هنا: http://underscorejs.org/#isArray

_.isArray(object) 

إرجاع true إذا كان الكائن عبارة عن مصفوفة.

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

أود أولاً التحقق مما إذا كان isArray يدعم isArray :

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

يمكنك أيضًا محاولة استخدام عامل التشغيل instanceof

v instanceof Array

إذا كان النوعان الوحيدان من القيم التي يمكن تمريرها إلى هذه الدالة عبارة عن سلسلة أو صفيف من السلاسل ، فاحتفظ بها بسيطة واستخدم التحقق من النوع لإمكانية السلسلة:

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

الطريقة المعطاة في معيار 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
}

تحقق من علاج شامل من مدونة TJ Crowder ، كما نشرت في تعليقه أدناه.

تحقق من هذا jsben.ch/#/QgYAV للحصول على فكرة الطريقة التي تؤدي بشكل أفضل: jsben.ch/#/QgYAV

من @Bharath تحويل السلسلة إلى صفيف باستخدام 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']

تخيل أن لديك هذه المجموعة أدناه:

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

Javascript (المتصفحات الجديدة والقديمة):

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

مسج:

$.isArray(arr);

الزاوي:

angular.isArray(arr);

Underscore و Lodash:

_.isArray(arr);

ستحول هذه الوظيفة أي شيء تقريبًا إلى مصفوفة:

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' ]

سيتم تحويل سلاسل NB إلى صفيف بعنصر مفرد بدلاً من صف من الأحرف. احذف علامة isString إذا كنت تفضلها isString .

لقد استعملت Array.isArray هنا لأنه الأكثر قوة وأبسط.


في المتصفحات الحديثة يمكنك القيام به

Array.isArray(obj)

( مدعوم من Chrome 5 و Firefox 4.0 و IE 9 و Opera 10.5 و Safari 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) السفلية يمكنك استخدام _.isArray(obj)

إذا لم تكن بحاجة إلى الكشف عن المصفوفات التي تم إنشاؤها في إطارات مختلفة ، يمكنك أيضًا استخدام instanceof

obj instanceof Array

لقد قمت بتحديث عزف jsperf مع طريقتين بديلة وكذلك التحقق من الأخطاء.

وتبين أن الطريقة التي تحدد قيمة ثابتة في النموذجين "Object" و "Array" تكون أسرع من أي طريقة أخرى. إنها نتيجة مفاجئة إلى حد ما.

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

لا تعمل هاتان الطريقتان إذا أخذ المتغير القيمة غير المحددة ، ولكنهما يعملان إذا كنت متأكداً من أن لهما قيمة. فيما يتعلق بالتحقق من الأداء في الاعتبار إذا كانت القيمة عبارة عن مصفوفة أو قيمة مفردة ، فإن الطريقة الثانية تبدو كطريقة سريعة صحيحة. إنه أسرع قليلاً من 'instanceof' على Chrome ، أسرع مرتين من ثاني أفضل طريقة في Internet Explorer و Opera و Safari (على الجهاز الخاص بي).


هذا هو الأسرع بين جميع الطرق (جميع المتصفحات المدعومة):

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

هل يمكن أن يكون isArray طريقة لكنني أفضل أن تحقق مع

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


هناك حل واحد فقط لهذا السؤال

x instanceof Array

حيث x هو المتغير سوف يرجع true إذا كان x صفيف و false إذا لم يكن.


وأود أن إجراء وظيفة لاختبار نوع الكائن الذي تتعامل معه ...

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
}

وإليك نهج كسلتي:

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 ، ولكن بالنسبة لحالتي في الاستخدام ، هذه ليست مشكلة.


يعمل Array.isArray بسرعة ، ولكنه غير مدعوم من قبل جميع إصدارات المتصفحات. لذا يمكنك إجراء استثناء للآخرين واستخدام الطريقة العامة:

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

يقدم 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>


يمكنك التحقق من نوع المتغير الخاص بك سواء كان مصفوفة مع؛

var myArray=[];

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


Array.isArray

Array.isArray = Array.isArray || function (vArg) {
    return Object.prototype.toString.call(vArg) === "[object Array]";
};

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

في البحث عن أقصر نسخة هنا هو ما حصلت عليه حتى الآن.

لاحظ أنه لا توجد وظيفة مثالية ستكتشف دائمًا جميع التركيبات الممكنة. من الأفضل أن تعرف جميع القدرات والقيود المفروضة على أدواتك من توقع أداة سحرية.





arrays