【发布时间】:2008-10-20 15:20:15
【问题描述】:
我的 JSON 调用的输出可以是数组或哈希。如何区分这两者?
【问题讨论】:
标签: javascript
我的 JSON 调用的输出可以是数组或哈希。如何区分这两者?
【问题讨论】:
标签: javascript
现代浏览器支持Array.isArray(obj) 方法。
See MDN 用于文档和 polyfill。
= 2008 年的原始答案 =
您可以使用输出的构造函数属性:
if(output.constructor == Array){
}
else if(output.constructor == Object){
}
【讨论】:
Array 和 Object 构造函数的不同实例,无法进行比较。我不太确定如何生成一个示例来演示这一点,但我在某处读到它。
window 环境中表现出来。
是对象:
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
}
【讨论】:
isObject 对对象和数组都返回 true,所以是多余的
您的意思是“对象”而不是“哈希”吗?
>>> 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);
【讨论】:
if(Array.isArray(obj)) return false; if(obj.constructor != Object))?
assert.equal(is_dictionary(new (class MyClass {})), true); 失败 - MyClass 的实例肯定是哈希/字典。
const assert = require('assert'); const is_dictionary = function (obj) { if(!obj) return false; if(Array.isArray(obj)) return false; if (({}).toString.apply(obj) !== '[object Object]') return false; return true; }; // returns true along your own with these values new (class MyClass {}) Object.create({}) Object.create(null) // returns false along with yours new String('foo') new Number(123) ()=> {} function() {} new Map
检查对象的“构造函数”属性。它是 Array - 它是一个数组对象。
变种 = { 'b':{长度:0}, 'c':[1,2] } if (a.c.constructor == 数组) for (var i = 0; i【讨论】:
解析json可以派上用场:)
isArrayHashs = (attr) ->
!!attr && attr.constructor == Array && isHash(attr[0])
isHash = (attr) ->
!!attr && !$.isNumeric(attr) && attr.constructor == Object
attr[0].constructor 必须是:
【讨论】:
比对象、散列或字典更实用和精确的术语可能是关联数组。对象可以适用于许多不受欢迎的人,例如typeof null === 'object' 或 [1,2,3] instanceof Object。以下两个函数从 ES3 开始工作并且互斥。
function is_array(z) {
return Object(z) instanceof Array;
}
console.assert(true === is_array([]));
console.assert(true === is_array([1,2,3]));
console.assert(true === is_array(new Array));
console.assert(true === is_array(Array(1,2,3)));
console.assert(false === is_array({a:1, b:2}));
console.assert(false === is_array(42));
console.assert(false === is_array("etc"));
console.assert(false === is_array(null));
console.assert(false === is_array(undefined));
console.assert(false === is_array(true));
console.assert(false === is_array(function () {}));
function is_associative_array(z) {
return String(z) === '[object Object]';
}
console.assert(true === is_associative_array({a:1, b:2}));
console.assert(true === is_associative_array(new function Legacy_Class(){}));
console.assert(true === is_associative_array(new class ES2015_Class{}));
console.assert(false === is_associative_array(window));
console.assert(false === is_associative_array(new Date()));
console.assert(false === is_associative_array([]));
console.assert(false === is_associative_array([1,2,3]));
console.assert(false === is_associative_array(Array(1,2,3)));
console.assert(false === is_associative_array(42));
console.assert(false === is_associative_array("etc"));
console.assert(false === is_associative_array(null));
console.assert(false === is_associative_array(undefined));
console.assert(false === is_associative_array(true));
console.assert(false === is_associative_array(function () {}));
注意这将如何将类的实例视为关联数组。 (但不是内置类的实例,例如 Date。)
【讨论】: