[英]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.