JSON调用的输出既可以是数组也可以是散列,如何区分这两种类型?
ct2axkht1#
现代浏览器支持Array.isArray(obj)方法。
Array.isArray(obj)
See MDN(用于文档)和polyfill。= * 2008年的原始答案 * =您可以使用输出的constructor属性:
if(output.constructor == Array){ } else if(output.constructor == Object){ }
mznpcxlj2#
是对象:
function isObject ( obj ) { return obj && (typeof obj === "object"); }
是数组:
function isArray ( obj ) { return isObject(obj) && (obj instanceof Array); }
因为数组是对象,所以您需要先测试变量是否为数组,然后再测试它是否为对象:
if (isArray(myObject)) { // do stuff for arrays } else if (isObject(myObject)) { // do stuff for objects }
hgc7kmma3#
你是说“对象”而不是“哈希”吗
>>> var a = []; >>> var o = {}; >>> a instanceof Array true >>> o instanceof Array false
icomxhvb4#
我做了一个函数来判断它是不是字典。
exports.is_dictionary = function (obj) { if(!obj) return false; if(Array.isArray(obj)) return false; if(obj.constructor != Object) return false; return true; }; // return true test.equal(nsa_utils.is_dictionary({}), true); test.equal(nsa_utils.is_dictionary({abc:123, def:456}), true); // returns false test.equal(nsa_utils.is_dictionary([]), false); test.equal(nsa_utils.is_dictionary([123, 456]), false); test.equal(nsa_utils.is_dictionary(null), false); test.equal(nsa_utils.is_dictionary(NaN), false); test.equal(nsa_utils.is_dictionary('hello'), false); test.equal(nsa_utils.is_dictionary(0), false); test.equal(nsa_utils.is_dictionary(123), false);
nzrxty8p5#
检查对象的“constructor”属性。它是Array -它是一个数组对象。
var a = { 'b':{length:0}, 'c':[1,2] } if (a.c.constructor == Array) for (var i = 0; i < a.c.length; i++) alert(a.c[i]); else for (var s in a.b); alert(a.b[s]);
vngu2lb86#
一个比object、hash或dictionary更实用、更精确的术语是associative array。Object可以应用于许多不需要的对象,例如typeof null === 'object'或[1,2,3] instanceof Object。以下两个函数从ES3开始工作,并且是互斥的。第一个请注意,这将如何将类的示例视为关联数组(但不是内置类的示例,如Date)。上面的&&子句是对这个晦涩的白盒测试的一个粗暴的修正:
typeof null === 'object'
[1,2,3] instanceof Object
&&
console.assert(false === is_associative_array("[object Object]"));
注意:这些函数对于大型或多个对象无效。
vvppvyoh7#
对于解析,json可以派上用场:)
isArrayHashs = (attr) -> !!attr && attr.constructor == Array && isHash(attr[0]) isHash = (attr) -> !!attr && !$.isNumeric(attr) && attr.constructor == Object
attr[0].构造函数必须为:
7条答案
按热度按时间ct2axkht1#
现代浏览器支持
Array.isArray(obj)
方法。See MDN(用于文档)和polyfill。
= * 2008年的原始答案 * =
您可以使用输出的constructor属性:
mznpcxlj2#
是对象:
是数组:
因为数组是对象,所以您需要先测试变量是否为数组,然后再测试它是否为对象:
hgc7kmma3#
你是说“对象”而不是“哈希”吗
icomxhvb4#
我做了一个函数来判断它是不是字典。
nzrxty8p5#
检查对象的“constructor”属性。它是Array -它是一个数组对象。
vngu2lb86#
一个比object、hash或dictionary更实用、更精确的术语是associative array。Object可以应用于许多不需要的对象,例如
typeof null === 'object'
或[1,2,3] instanceof Object
。以下两个函数从ES3开始工作,并且是互斥的。第一个
请注意,这将如何将类的示例视为关联数组(但不是内置类的示例,如Date)。
上面的
&&
子句是对这个晦涩的白盒测试的一个粗暴的修正:注意:这些函数对于大型或多个对象无效。
vvppvyoh7#
对于解析,json可以派上用场:)
attr[0].构造函数必须为: