在javascript中,我们如何识别一个对象是Hash还是Array?

7eumitmz  于 2022-11-20  发布在  Java
关注(0)|答案(7)|浏览(115)

JSON调用的输出既可以是数组也可以是散列,如何区分这两种类型?

ct2axkht

ct2axkht1#

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

See MDN(用于文档)和polyfill。
= * 2008年的原始答案 * =
您可以使用输出的constructor属性:

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

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
}
hgc7kmma

hgc7kmma3#

你是说“对象”而不是“哈希”吗

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

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

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

vngu2lb86#

一个比object、hash或dictionary更实用、更精确的术语是associative array。Object可以应用于许多不需要的对象,例如typeof null === 'object'[1,2,3] instanceof Object。以下两个函数从ES3开始工作,并且是互斥的。
第一个
请注意,这将如何将类示例视为关联数组(但不是内置类的示例,如Date)。
上面的&&子句是对这个晦涩的白盒测试的一个粗暴的修正:

console.assert(false === is_associative_array("[object Object]"));

注意:这些函数对于大型或多个对象无效。

vvppvyoh

vvppvyoh7#

对于解析,json可以派上用场:)

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

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

attr[0].构造函数必须为:

  • 字符串
  • 数字
  • 数组
  • 对象名称
  • 未定义

相关问题