JavaScript: bağımsız değişkenin nesne yerine dizi olup olmadığını algılama (Node.JS)


87

Argümanın bir dizi olup olmadığını nasıl tespit etmeliyim çünkü typeof []döner 'object've diziler ve nesneler arasında ayrım yapmak istiyorum.

Nesne benzeyebilir {"0":"string","1":"string","length":"2"}ama aslında dizi gibi görünen bir nesne ise bir dizi olarak çıkmasını istemiyorum.

JSON.parseve JSON.stringifybu ayrımı yapabilirler. Nasıl yapabilirim?

Chrome ile aynı V8'e dayanan Node.JS kullanıyorum.

Yanıtlar:


164
  • Array.isArray

yerel V8 işlevi. Hızlıdır, her zaman doğrudur. Bu, ES5'in bir parçasıdır.

  • arr instanceof Array

Nesnenin dizi yapıcısı ile yapılıp yapılmadığını kontrol eder.

Alt çizgiden bir yöntem. İşte kaynaklarından alınan bir pasaj

var toString = Object.prototype.toString,
    nativeIsArray = Array.isArray;
_.isArray = nativeIsArray || function(obj) {
    return toString.call(obj) === '[object Array]';
};

Bu yöntem bir nesneyi alır ve Object.prototype.toStringonun üzerinde yöntemi çağırır . Bu her zaman [object Array]diziler için dönecektir .

Kişisel deneyimlerime göre, toStringyöntemi sormanın en etkili olduğunu buluyorum , ancak bu kadar kısa veya okunaklı değil instanceof Array, o kadar hızlı Array.isArraydeğil ama bu ES5 kodu ve onu taşınabilirlik için kullanmaktan kaçınma eğilimindeyim.

Şahsen underscore, içinde ortak yardımcı program yöntemleri bulunan bir kitaplık olan kullanmayı denemenizi tavsiye ederim . Kodunuzu KURUTAN birçok kullanışlı işlevi vardır.


1
Node.js utilkitaplığını kullanın - require('util').isArray(arr) nodejs.org/api/util.html#util_util_isarray_object
Kof

5
nazik bir hatırlatma, ('util']. isArray (arr) düğüm v4.00 ve üstü. Kullanımdan kaldırıldı
Sunil Khiatani

Her nasılsa, Düğüm 10.x'te arr instanceof Arraybaşarısız gibi görünüyor . Ancak Array.isArray()işler harika.
Alexis Wilke


8

Peki ya:

your_object instanceof Array

Chrome'da V8'de

[] instanceof Array
> true
({}) instanceof Array
> false 
({"0":"string","1":"string","length":"2"}) instanceof Array
> false

7

Bu sorunun birkaç iyi cevabı var gibi görünüyor, ancak bütünlük için daha önce önerilmeyen başka bir seçenek ekleyeceğim.

Bir şeyin bir dizi olup olmadığını kontrol etmek için, Node.js utilyerel modülünü ve isArray()işlevini kullanabilirsiniz.

Misal:

var util = require('util');

util.isArray([]);  // true
util.isArray(new Array); // true
util.isArray({"0":"string","1":"string","length":"2"}); // false

Bu yöntemle, her zaman doğru cevabı göstereceğinden, V8 tarafından uygulanan JS standartları hakkında endişelenmenize gerek yoktur.


5
FWIW, util.isArray()şu anda vekil Array.isArray(): github.com/joyent/node/blob/…
Tom Spencer

0

Şu yolu deneyin:
console.log (Object.prototype.toString.call (arg) .replace (/ ^ [nesne (. +)] $ /, '$ 1'). ToLowerCase ())

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.