簡體   English   中英

在javascript中,我們如何識別對象是哈希還是數組?

[英]In javascript how can we identify whether an object is a Hash or an Array?

我的 JSON 調用的輸出可以是 Array 或 Hash。 我如何區分這兩者?

現代瀏覽器支持Array.isArray(obj)方法。

有關文檔和 polyfill, 請參閱 MDN

= 2008 年的原始答案=

您可以使用輸出的構造函數屬性:

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

檢查對象上的“構造函數”屬性。 它是 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]);

對於解析 json 可以派上用場:)

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

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

attr[0].constructor 必須是:

  • 細繩
  • 數字
  • 大批
  • 目的
  • 不明確的

比對象或哈希或字典更實用和精確的術語可能是關聯數組 Object 可能適用於許多不受歡迎的對象,例如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。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM