sort - javascript object array




檢查對像是否是數組? (20)

我正在嘗試編寫一個接受字符串列表或單個字符串的函數。 如果它是一個字符串,那麼我想將它轉換為只有一個項目的數組。 然後我可以循環它而不用擔心錯誤。

那麼我該如何檢查變量是否是一個數組?

我已經完成了下面的各種解決方案,並創建了一個jsperf測試


Array.isArray運行速度很快,但並不是所有版本的瀏覽器都支持它。 所以你可以為其他人做一個例外並使用通用方法:

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

ECMAScript標準中給出的用於查找Object類的方法是使用Object.prototypetoString方法。

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

或者你可以使用typeof來測試它是否是一個字符串:

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

或者如果你不關心性能,你可以直接對一個新的空數組進行連接。

someVar = [].concat( someVar );

還有你可以直接查詢的構造函數:

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

查看@TJ Crowder博客的全面處理 ,如下面的評論中所述。

查看此jsben.ch/#/QgYAV以了解哪種方法表現更好: jsben.ch/#/QgYAVjsben.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']

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>


Array.isArray

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

你可能是isArray方法,但我更願意檢查

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


在現代瀏覽器中,您可以做到

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)

如果您不需要檢測在不同幀中創建的數組,您也可以使用instanceof

obj instanceof Array

如果您知道對像沒有concat方法,則可以使用以下方法。

var arr = [];
if (typeof arr.concat === 'function') {
    console.log("It's an array");
}



想像一下,下面有這個數組:

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

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

Array.isArray(arr);

jQuery的:

$.isArray(arr);

角度:

angular.isArray(arr);

下劃線和Lodash:

_.isArray(arr);

我會創建一個函數來測試你正在處理的對象的類型......

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語句......

if(whatAmI(myVar) === "Array"){
    // do array stuff
} else { // could also check `if(whatAmI(myVar) === "String")` here to be sure
    // do string stuff
}

我知道,人們正在尋找某種原始的javascript方法。 但如果你想減少思考,請看一下: http://underscorejs.org/#isArrayhttp://underscorejs.org/#isArray

_.isArray(object) 

如果object是Array,則返回true。

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

我見過的最好的解決方案是替換typeof的跨瀏覽器。 here查看Angus Croll的解決方案。

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

我首先檢查你的實現是否支持isArray

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

您也可以嘗試使用instanceof運算符

v instanceof Array

檢查對像是否為數組的最簡單,最快捷的方法。

 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

測試輸入值是否為數組的簡單函數如下:

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

這適用於跨瀏覽器和舊版瀏覽器。 這是從TJ Crowders的博客文章中提取的


簡單的功能來檢查這個:

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

這個函數幾乎可以將任何東西變成數組:

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 ,因為它是最強大也最簡單的。


這個問題只有一個解決方案

x instanceof Array

其中x是變量,如果x是數組,它將返回true,如果不是則返回false。


這是所有方法中最快的(支持所有瀏覽器):

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

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

為了尋找最短版本,這是我到目前為止所得到的。

請注意,沒有完美的功能可以始終檢測所有可能的組合。 了解工具的所有能力和局限性比預期魔術工具更好。





arrays