JavaScript: виявлення, якщо аргументом є масив замість об'єкта (Node.JS)


87

Як я повинен виявити, якщо аргумент є масивом, тому що typeof []повертається, 'object'і я хочу розрізнити масиви та об'єкти.

Можливо, об’єкт буде виглядати так, {"0":"string","1":"string","length":"2"}але я не хочу, щоб він вийшов як масив, якщо насправді це об’єкт, схожий на масив.

JSON.parseі JSON.stringifyздатні зробити це розрізнення. Як я можу це зробити?

Я використовую Node.JS, який базується на V8 так само, як і Chrome.

Відповіді:


164
  • Array.isArray

рідна функція V8. Це швидко, це завжди правильно. Це частина ES5.

  • arr instanceof Array

Перевіряє, чи створено об’єкт за допомогою конструктора масиву.

Метод підкреслення. Ось фрагмент, взятий з їх джерела

var toString = Object.prototype.toString,
    nativeIsArray = Array.isArray;
_.isArray = nativeIsArray || function(obj) {
    return toString.call(obj) === '[object Array]';
};

Цей метод бере об'єкт і викликає Object.prototype.toStringметод на ньому. Це завжди повернеться[object Array] для масивів.

На моєму особистому досвіді я вважаю, що запитання про toStringметод є найефективнішим, але він не такий короткий або читабельний, як instanceof Arrayі не такий швидкий, якArray.isArray але це код ES5, і я, як правило, уникаю використання його для перенесення.

Я особисто рекомендую вам спробувати скористатися underscoreцією бібліотекою із загальними корисними методами. Він має безліч корисних функцій, які висушують ваш код.


1
Використовувати utilбібліотеку node.js - require('util').isArray(arr) nodejs.org/api/util.html#util_util_isarray_object
Kof

5
ніжне нагадування, не вимагайте ('util'). isArray (arr) у вузлі v4.00 і вище. Це застаріло
Sunil Khiatani

Якось у Node 10.x це здається arr instanceof Arrayневдалим. Однак Array.isArray()працює чудово.
Alexis Wilke


8

Як на рахунок:

your_object instanceof Array

У V8 в Chrome я отримую

[] instanceof Array
> true
({}) instanceof Array
> false 
({"0":"string","1":"string","length":"2"}) instanceof Array
> false

7

Здається, це питання має кілька хороших відповідей, але для повноти я б додав ще один варіант, який раніше не пропонувався.

Для того, щоб перевірити, чи є щось масивом, ви можете використовувати utilвласний модуль Node.js та йогоisArray() функцію.

Приклад:

var util = require('util');

util.isArray([]);  // true
util.isArray(new Array); // true
util.isArray({"0":"string","1":"string","length":"2"}); // false

За допомогою цього методу вам не доведеться турбуватися про стандарти JS, впроваджені V8, оскільки він завжди покаже правильну відповідь.


5
FWIW, в util.isArray()даний час проксі до Array.isArray(): github.com/joyent/node/blob/…
Том Спенсер

0

Спробуйте таким чином:
console.log (Object.prototype.toString.call (arg) .replace (/ ^ [object (. +)] $ /, '$ 1'). ToLowerCase ())

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.