В javascript мы можем определить, является ли объект Hash или Array?

Вывод моего вызова JSON может быть либо массивом, либо хешем. Как отличить эти два?

Ответ 1

Современные браузеры поддерживают метод Array.isArray(obj).

См. MDN для документации и polyfill.

= оригинальный ответ от 2008 =

вы можете использовать свойство constuctor для вашего вывода:

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

Ответ 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
}

Ответ 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);

Ответ 5

Проверьте свойство "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]);

Ответ 6

Для парсинга json может пригодиться:)

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

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

attr [0].constructor должен быть:

  • Строка
  • Числовые
  • Массив
  • Объект
  • Undefined