Soru Nesne dizisi olup olmadığını kontrol et


Dizelerin bir listesini veya tek bir dizeyi kabul eden bir işlev yazmaya çalışıyorum. Bir dize ise, o zaman onu sadece bir öğeyle bir diziye dönüştürmek istiyorum. Sonra bir hatadan korkmadan bunun üstesinden gelebilirim.

Yani değişkenin bir dizi olup olmadığını nasıl kontrol ederim?


Aşağıdaki çeşitli çözümleri tamamladım ve jsperf testi.


2146
2018-01-23 18:53


Menşei


'Nesnenin bir dizi olup olmadığını kontrol etmeyi' istediğini sanıyordum, ama 'nesnenin bir dizi dizge veya tek bir dizge' olup olmadığını kontrol etmek istiyorsun. Gördüğünden emin değil misin? Yoksa sadece ben mi? Daha çok bir şey düşünüyordum bu... burada bir şey eksik olan ben miyim? - rr1g0
TL; DR - arr.constructor === Array en hızlısı. - Neta
jsben.ch/#/QgYAV - En yaygın yöntemler için bir ölçüt - EscapeNetscape
TL; DR - Dizi.isArray (arr) ES5'ten beri; ve $.isArray (arr) jQuery içinde. - Ondra Žižka
Unutmayın ki, eğer herhangi bir sebeple yapıcınızın üzerine prototip yoluyla yazıyorsanız arr.constructor === Array Test yanlış dönecektir. Array.isArray(arr) yine de gerçektir. - ghaschel


Cevaplar:


Modern tarayıcılarda yapabilirsiniz

Array.isArray(obj)

(Tarafından desteklenen Chrome 5, Firefox 4.0, IE 9, Opera 10.5 ve Safari 5)

Geriye dönük uyumluluk için aşağıdakileri ekleyebilirsiniz

# 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 kullanırsanız kullanabilirsiniz jQuery.isArray(obj) veya $.isArray(obj). Alt çizgi kullanırsanız kullanabilirsiniz _.isArray(obj)

Farklı karelerde oluşturulmuş dizileri tespit etmeniz gerekmiyorsa, sadece instanceof

obj instanceof Array

319
2018-01-06 18:11



Burada bir daha eksiksiz destekleyen tarayıcıların listesi Array.isArray - lightswitch05
if (typeof Array.isArray === 'undefined') { olarak değiştirilebilir if(!Array.isArray) { - iMatoria
Ne için değer Object.prototype.string.call(obj) Nesne varsa sahte olabilir Symbol.toStringTag üstünde. Bu, gemilerin herhangi bir çevreden haberdar olmadığımı söyledi Symbol.toStringTag Ama değil Array.isArray Bu güvenli görünüyor. - Benjamin Gruenbaum


Nesne sınıfını bulmak için ECMAScript standardında verilen yöntem, toString yöntemi Object.prototype.

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

Ya da kullanabilirsiniz typeof bir dize olup olmadığını sınamak için:

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

Ya da performanstan endişe etmiyorsanız, sadece concat yeni bir boş Diziye.

someVar = [].concat( someVar );

Doğrudan sorgulayabileceğiniz kurucu da var:

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

Bir göz atın kapsamlı tedavi itibaren @ T.J. Crowder en blogu, aşağıdaki yorumunda görüldüğü gibi.

Bunu kontrol et kıyaslama Hangi yöntemin daha iyi performans gösterdiğini öğrenmek için: http://jsben.ch/#/QgYAV

itibaren @Bharath Sorulan soru için Es6'yı kullanarak dizgiyi diziye dönüştür:

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

varsayalım:

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

1866
2018-01-23 18:54



+1 Yup, toString gitmenin yollarından biridir. Ben burada bir dönüş yapacağım: blog.niftysnippets.org/2010/09/say-what.html - T.J. Crowder
"[Object Array]" yazmak istemiyorsanız, Object.prototype.toString.call (someVar) === Object.prototype.toString.call ([]) komutunu kullanın ya da eğer isterseniz Object.prototype.toString.call yazmak istemiyorum - Pramod
Vay. Concat metodu tek hastalıklı sıçan. +2 verirdim ama buna izin verilmedi - Dark Star1
'Modern tarayıcılarda' (yani IE9 + ve diğer herkes) çalışan vanilya Array.isArray'ı kullanıyorum. Ve eski tarayıcı desteği için MDN'den şimi kullanın developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - David Gilbertson
Modern dünyada yaşa - Array.isArray(obj) - mcfedr


İlk olarak uygulamanızın destekleyip desteklemediğini kontrol ederim isArray:

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

Kullanmayı da deneyebilirsiniz. instanceof Şebeke

v instanceof Array

1225
2018-01-23 18:55



İnstanceof Dizisi için +1. En basit AFAICT - Tom Auger
v instanceof Array yanlış döndürürse v başka bir çerçevede oluşturulduv örneği thatFrame.contentWindow.Array sınıf). - pepkin88
Spesifik olmak: Array.isArray ECMAScript 5 / Javascript 1.8.5'in bir parçası olarak tanımlanır. - jevon
Gerçekten basit ve temiz bir çözüm BUT isArray bazı eski tarayıcılarla uyumlu değildir (e.x. IE7 ve IE8). Kaynak: kangax.github.io/es5-compat-table/# - Wookie88
Ne hakkında: if (Array.isArray) Array.isArray (v) değerini döndürürse; else v instanceof dizisini döndürür; - lewdev


jQuery ayrıca bir sunuyor $.isArray() yöntem:

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>


283
2018-04-02 12:15



Bir referans olarak: api.jquery.com/jQuery.isArray - Akseli Palén
Sadece bir not, jQuery dahili olarak toString yöntemini kullanır: GitHub Kaynağı - Jacob Squires
@JacobSquires buna bağlıdır. Burada yeni test ettim, Chrome'daki en yeni jQuery - $.isArray === Array.isArray doğru geri dönüyor. - Renan
@Renan: Bu jQuery kullanımı hakkında iyi bir şey. Genellikle bunu yapmak için en modern ve en iyi yöntemi kullanır ve neyi kullanacağınızı bilmek için kendinizi kontrol eden tüm özellikleri yapmanız gerekmez. - awe
Ama kimse bu işlevsellik için JQuery SADECE kullanmayacak değil mi? Ben sadece jquery indirmezdim çünkü bir şey bir dizi olup olmadığını kontrol etmek istiyorum: p - Automagisch


Bu, tüm yöntemler arasında en hızlı olanıdır (tüm tarayıcılar desteklenir):

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

84
2017-12-06 10:12



Haklısınız, bu soruya dahil ettiğim testlere göre en hızlı olanı. - mpen
Bu yöntemi kullanmak için herhangi bir olumsuzluk var mı? Kabul edilen en iyi cevaptan çok daha basit ve etkili görünüyor. - David Meza
@shinobi - sadece merak (ve bunu sık sık görmüştüm) - neden durumu ifade ediyorsun if (obj && Array === obj.constructor) aksine if (obj && obj.constructor === Array) ? İngilizceye çeviride kayıp mı, sonra kodla mı? Örneğin, ingilizce konuşanlar genellikle "nesne var mıdır ve kurucu dizi sınıfından mı geliyor?" diye sormaya eğilimlidir, bu yüzden okuma sırasında kod akışı daha mantıklıdır. ya da bazı teknik sebepler var mı? - 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();} - unsynchronized
@shinobi hepsi iyi. Güvenli bir alışkanlıktan hangover olabileceğini varsayalım - eğer yanlışlıkla = yerine == kullanırsanız, atanabilir bir değişken olarak derlemez. - unsynchronized


Array.isArray hızlı çalışır, ancak tüm tarayıcı sürümleri tarafından desteklenmez. Yani başkaları için bir istisna yapabilir ve evrensel yöntem kullanabilirsiniz:

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

31
2017-12-10 17:01



Diğer kullanıcılar için daha kolay anlaşılması için kodun bir açıklamasını eklemek isteyebilirsiniz, aksi halde - hoş. +1 - Jeff
Almalısın .toString() yöntemi Object.prototype. Şu an kullanıyorsunuz window.toString(), aynı değil. - the system
Haklısın. window.toString aynı şeyi yap Object.prototype.toString sadece Chrome'da. - CruorVult
vay (Array'da 'isArray'). Daha önce hiç görmedim. thks - Ivan Ferrer Villa
isArray hiç de hızlı değil. Bu en yavaş yöntemdir. - jemiloii


Aşağıdaki bu dizininiz olduğunu düşünün:

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

Javascript (yeni ve eski tarayıcılar):

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

veya

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

veya

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

o zaman şöyle diyoruz:

isArray(arr);

Javascript (IE9 +, Ch5 +, FF4 +, Saf5 +, Opera10.5 +)

Array.isArray(arr);

jQuery:

$.isArray(arr);

Açısal:

angular.isArray(arr);

Alt Seviye ve Lodash:

_.isArray(arr);

29
2017-12-27 13:17





Bunu kontrol etmek için basit bir işlev:

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

20
2017-09-04 17:56



Onu bir çizgiye indiririm. return object.constructor === Array - Ama bunun sadece diziler için geçerli olduğuna emin misin? - mpen
Tüm boole ifadeleri ile bunu yapabilir. Gördüğümde beni delirtiyor if(x) return true; else return false :-) Geriye olsa bile, ifadeyi reddetmelisiniz. - mpen
Bunun getElementsByTagName için true olmaması nedenidir, çünkü bu işlevin sonucu aslında bir HTMLCollection ve bir dizi değil. - Yuval A.
Nesne tanımsız veya boşsa, bu hata çok başarısız olur. - John Henckel
@JohnHenckel Cevabımı gör stackoverflow.com/a/29400289/34806 tek bir satırda, hem ilk değerlendirmenin yanı sıra, hem ilk kaygınızı hesaba katar - George Jempty