在javascript中我们如何识别对象是Hash还是数组?

时间:2008-10-20 15:20:15

标签: javascript

我的JSON调用的输出可以是数组或哈希。我如何区分这两者?

7 个答案:

答案 0 :(得分:115)

现代浏览器支持Array.isArray(obj)方法。

See MDN用于文档和polyfill。

= 2008年的原始答案 =

您可以使用输出的constuctor属性:

if(output.constructor == Array){
}
else if(output.constructor == Object){
}

答案 1 :(得分:25)

是对象:

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
}

答案 2 :(得分:9)

您的意思是“对象”而不是“哈希”吗?

>>> var a = [];
>>> var o = {};
>>> a instanceof Array
true
>>> o instanceof Array
false

答案 3 :(得分:5)

我做了一个确定它是否是字典的函数。

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

答案 4 :(得分:0)

检查对象上的“构造函数”属性。它是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]);

答案 5 :(得分:0)

解析json可以派上用场:)

isArrayHashs = (attr) ->
  !!attr && attr.constructor == Array && isHash(attr[0])

isHash = (attr) ->
  !!attr && !$.isNumeric(attr) && attr.constructor == Object

attr [0] .constructor必须是:

  • 字符串
  • 数字
  • 阵列
  • 对象
  • 未定义

答案 6 :(得分:0)

关联数组是比对象或哈希或字典更实用,更精确的术语。对象可能适用于许多不良情况,例如typeof null === 'object'[1,2,3] instanceof Object。自ES3以来,以下两个功能正常工作,并且自然排他。

function is_array(z) {
    return Object.prototype.toString.call(z) === '[object 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 Object.prototype.toString.call(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。)

感谢RobG's solution沿这些行使用Array.isArray()polyfill。这将使用Object类的本机toString()方法,该方法简洁高效地报告类型。