我的JSON调用的输出可以是数组或哈希.我该如何区分这两者?
现代浏览器支持该Array.isArray(obj)
方法.
有关文档和polyfill,请参阅MDN.
= 2008年的原始答案 =
您可以使用输出的constuctor属性:
if(output.constructor == Array){ } else if(output.constructor == Object){ }
对象:
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 }
你的意思是"对象"而不是"哈希"吗?
>>> var a = []; >>> var o = {}; >>> a instanceof Array true >>> o instanceof Array false
我做了一个函数来确定它是否是字典.
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);