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
ใช้ Node.js utilห้องสมุด - require('util').isArray(arr) nodejs.org/api/util.html#util_util_isarray_object
Kof

5
คำเตือนอย่างอ่อนโยนเราไม่ต้องการ ('util') isArray (arr) ในโหนด v4.00 ขึ้นไป เลิกใช้แล้ว
Sunil Khiatani

อย่างไรก็ตามในโหนด 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/…
Tom Spencer

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.