【问题标题】:In javascript how can we identify whether an object is a Hash or an Array?在javascript中,我们如何识别对象是哈希还是数组?
【发布时间】:2008-10-20 15:20:15
【问题描述】:

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

【问题讨论】:

    标签: javascript


    【解决方案1】:

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

    See MDN 用于文档和 polyfill。

    = 2008 年的原始答案 =

    您可以使用输出的构造函数属性:

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

    【讨论】:

    • 这有可能在不同页面之间发生冲突,因为它们都有 Array 和 Object 构造函数的不同实例,无法进行比较。我不太确定如何生成一个示例来演示这一点,但我在某处读到它。
    • @ripper234 该问题将在多 window 环境中表现出来。
    • +1 用于提及 Array.isArray。检查此链接以获得 borwser 支持:kangax.github.io/compat-table/es5/#Array.isArray
    • 任何使用underscore.js 的人都会发现isArray 和isObject 很有用。
    • 不幸的是,@akotian _.isObject 对数组和哈希都返回 true。您需要额外的条件逻辑来解决带有下划线的解决方案。
    【解决方案2】:

    是对象:

    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
    }
    

    【讨论】:

    • 好答案。您可能希望添加每个 js 对象都可以视为哈希。
    • isObject(new Date())) 是真的,但在这个问题的意义上,日期不是对象/散列。当然我们只是把它应用到 JSON 上,但是方法名真的很混乱。
    • isObject 对对象和数组都返回 true,所以是多余的
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      我做了一个判断它是否是字典的函数。

      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
      【解决方案5】:

      检查对象的“构造函数”属性。它是 Array - 它是一个数组对象。

      变种 = { 'b':{长度:0}, 'c':[1,2] } if (a.c.constructor == 数组) for (var i = 0; i

      【讨论】:

        【解决方案6】:

        解析json可以派上用场:)

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

        attr[0].constructor 必须是:

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

        【讨论】:

          【解决方案7】:

          比对象、散列或字典更实用和精确的术语可能是关联数组。对象可以适用于许多不受欢迎的人,例如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。)

          【讨论】:

            猜你喜欢
            • 2012-01-23
            • 1970-01-01
            • 2015-07-24
            • 2012-06-19
            • 1970-01-01
            • 2018-12-27
            • 2016-10-04
            • 1970-01-01
            • 2011-01-07
            相关资源
            最近更新 更多