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




على المصفوفات (25)

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

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

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


Answers

يمكنك تجربة هذا النهج: http://web.archive.org/web/20100424091244/http://www.ajaxdr.com/code/javascript-version-of-phps-is_array-function/

تحرير : أيضا ، إذا كنت تستخدم JQuery بالفعل في المشروع الخاص بك ، يمكنك استخدام وظيفتها $.isArray() .


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

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 هنا لأنه الأكثر قوة وأبسط.


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

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

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

v instanceof Array

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

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

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

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

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


دالة بسيطة للاختبار إذا كانت قيمة الإدخال هي صفيف هي التالية:

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

يعمل هذا عبر المتصفح ، ومع المتصفحات القديمة. تم سحب هذا من مشاركة مدونة TJ Crowders


هذه محاولتي لتحسين هذا الجواب مع مراعاة التعليقات:

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

يتخلص من if / else ، ويحاسب على احتمال أن تكون الصفيف خالية أو غير محددة


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

 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

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

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

الحل الأفضل الذي رأيته هو استبدال عبر المستعرض لـ typeof. تحقق من حل أنجوس كرول here .

إصدار TL ؛ DR هو أقل من ذلك ، ولكن المقال عبارة عن مناقشة كبيرة للمشكلة ، لذا يجب عليك قراءتها إذا كان لديك الوقت.

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 */};

وظيفة بسيطة للتحقق من هذا:

function isArray(object)
{
    if (object.constructor === Array) return true;
    else return false;
}

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

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


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

_.isArray(object) 

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

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

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

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

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

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

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

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

x instanceof Array

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


يمكنك تجربة هذا:

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

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

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

أفعل هذا بطريقة بسيطة للغاية. يعمل لدي. أي عيوب؟

Array.prototype.isArray = true;

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

هناك مثال جميل في كتابات Stoyan Stefanov التي تحوي أنماط JavaScript التي من المفترض أن تعالج جميع المشاكل المحتملة بالإضافة إلى استخدام طريقة ECMAScript5 Array.isArray () .

حتى هنا هو عليه:

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

بالمناسبة ، إذا كنت تستخدم jQuery ، يمكنك استخدام $.isArray()


كما يقول MDN هنا :

استخدم Array.isArray أو Object.prototype.toString.call للتمييز بين الكائنات العادية من الصفائف

مثله:

  • Object.prototype.toString.call(arr) === '[object Array]' ، أو

  • Array.isArray(arr)


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

var myArray=[];

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

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

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
}

بدلاً من استخدام new Date() يجب عليك استخدام:

var timestamp = Date.parse('foo');

if (isNaN(timestamp) == false) {
  var d = new Date(timestamp);
}

Date.parse() بإرجاع الطابع الزمني ، عدد صحيح يمثل عدد المللي ثانية منذ 01 / يناير / 1970. ستقوم بإرجاع NaN إذا لم تتمكن من تحليل سلسلة التاريخ الموردة.







javascript arrays