ความยาวของวัตถุ JavaScript


2383

ฉันมีวัตถุ JavaScript มีวิธีปฏิบัติที่ดีที่สุดในตัวหรือเป็นที่ยอมรับเพื่อให้ได้ความยาวของวัตถุนี้หรือไม่

const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

15
ตัวอักษรของวัตถุในจาวาสคริปต์โดยค่าเริ่มต้นเชื่อมโยงอาร์เรย์เช่น object.propertyName.propertyValue เป็นเช่นเดียวกับวัตถุ [propertyName] [propertyValue]
neitony

6
เพิ่มหนึ่งซับใน Underscore.js ซึ่งทำสิ่งนี้: stackoverflow.com/a/11346637/11236
ripper234

31
เมื่อคำตอบบรรทัดใช้ Object.keys (myArray) .length ตามที่ @aeosynth กล่าว
Ranadheer Reddy

67
โอเคแล้วObject.keys(obj).length
มูฮัมหมัดอูเมอร์

5
เหตุใดจึงไม่วัตถุความยาวที่ถูกต้อง? มันส่งคืนผลลัพธ์ที่ถูกต้องสำหรับฉัน
Adrian M

คำตอบ:


2623

คำตอบที่มีประสิทธิภาพมากที่สุด (เช่นที่จับภาพเจตนาของสิ่งที่คุณพยายามทำในขณะที่ทำให้เกิดข้อบกพร่องน้อยที่สุด) คือ:

Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

// Get the size of an object
var size = Object.size(myObj);

มีการเรียงลำดับของการประชุมใน JavaScript ที่คุณไม่ได้เพิ่มสิ่งต่าง ๆ ใน Object.prototypeเพราะมันสามารถแยกการแจกแจงในไลบรารีต่างๆ แม้ว่าการเพิ่มวิธีการไปยังวัตถุมักจะปลอดภัย


นี่คือการอัปเดตในปี 2559 และการปรับใช้ ES5 อย่างกว้างขวางและอื่น ๆ สำหรับ IE9 + และเบราว์เซอร์ที่มีความสามารถ ES5 + ที่ทันสมัยอื่น ๆ คุณสามารถใช้Object.keys()เพื่อให้โค้ดข้างต้นกลายเป็น:

var size = Object.keys(myObj).length;

สิ่งนี้ไม่จำเป็นต้องแก้ไขต้นแบบที่มีอยู่ตั้งแต่Object.keys()ตอนนี้ภายใน

แก้ไข : วัตถุสามารถมีคุณสมบัติเป็นสัญลักษณ์ซึ่งไม่สามารถส่งคืนได้ด้วยวิธีการ Object.key ดังนั้นคำตอบจะไม่สมบูรณ์โดยไม่ต้องพูดถึง

เพิ่มประเภทสัญลักษณ์ในภาษาเพื่อสร้างตัวระบุที่ไม่ซ้ำกันสำหรับคุณสมบัติของวัตถุ ประโยชน์หลักของประเภทสัญลักษณ์คือการป้องกันการเขียนทับ

Object.keysหรือObject.getOwnPropertyNamesไม่ทำงานสำหรับคุณสมบัติเชิงสัญลักษณ์ Object.getOwnPropertySymbolsจะกลับพวกเขาคุณจะต้องใช้

var person = {
  [Symbol('name')]: 'John Doe',
  [Symbol('age')]: 33,
  "occupation": "Programmer"
};

const propOwn = Object.getOwnPropertyNames(person);
console.log(propOwn.length); // 1

let propSymb = Object.getOwnPropertySymbols(person);
console.log(propSymb.length); // 2

65
@Tres - รหัสของคุณอาจเสียหายได้ถ้ามีใครบางคนเข้ามาแทนที่คุณสมบัติ 'ขนาด' โดยไม่ทราบว่าคุณได้ประกาศมันไว้ที่ไหนสักแห่งในรหัสดังนั้นมันจึงคุ้มค่าที่จะตรวจสอบว่ามีการกำหนดไว้แล้วหรือไม่
vsync

19
@vsync คุณถูกต้องมาก หนึ่งควรดำเนินการตรวจสอบสติจำเป็น :)
Tres

132
ทำไมทุกคนถึงไม่สนใจสิ่งนี้:Object.keys(obj).length
Muhammad Umer

33
@MuhammadUmer อาจเป็นเพราะวิธีการนั้นไม่มีอยู่เมื่อเขียนคำตอบนี้ แม้กระทั่งทุกวันนี้การใช้งานอาจจะต้องใช้ polyfill สำหรับเบราว์เซอร์รุ่นเก่า
Chris Hayes

21
@stonyau IE8, IE9, IE10 เป็นเบราว์เซอร์ที่ตายแล้วซึ่งไม่ได้รับการสนับสนุนจาก Microsoft ผู้ใช้ IE8, IE9, IE10 ได้รับการแจ้งเตือนจาก Microsoft ว่าพวกเขาใช้เบราว์เซอร์รุ่นเก่าที่ไม่รองรับและควรคาดหวังว่าสิ่งต่างๆจะไม่ทำงานสำหรับพวกเขา support.microsoft.com/en-us/kb/3123303
Lukas Liesis

1705

หากคุณรู้ว่าไม่ต้องกังวลเรื่องhasOwnPropertyเช็คคุณสามารถทำได้ง่ายๆ:

Object.keys(myArray).length

23
ทำไมจะไม่ล่ะ? จากสิ่งที่ฉันรู้ว่ามันเป็นมาตรฐาน: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/ …
vsync

104
มันไม่ใช่วิธีที่นำไปใช้ในระดับสากลแต่คุณสามารถตรวจสอบว่าเบราว์เซอร์ใดที่รองรับกับตารางนี้
aeosynth

51
ไม่รองรับ IE8 = ไม่ไป
ripper234

22
เวลาเปลี่ยนไปใช้ firefox = น่าเสียดายที่คุณเปลี่ยนไม่ได้หมายความว่าผู้ใช้เว็บไซต์ของคุณจะ ...
mdup

82
@ ripper234 ไม่มีการสนับสนุน IE = เวลาในการ polyfill
John Dvorak

287

อัปเดต : หากคุณใช้Underscore.js (แนะนำให้ใช้มันมีน้ำหนักเบา!) จากนั้นคุณสามารถทำได้

_.size({one : 1, two : 2, three : 3});
=> 3

ถ้าไม่และคุณไม่ต้องการยุ่งกับคุณสมบัติของวัตถุด้วยเหตุผลใดก็ตามและใช้ jQuery อยู่แล้วปลั๊กอินก็สามารถเข้าถึงได้อย่างเท่าเทียมกัน:

$.assocArraySize = function(obj) {
    // http://stackoverflow.com/a/6700/11236
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

7
_.size()เป็นโซลูชั่นที่สมบูรณ์แบบสำหรับโครงการMeteorของฉันซึ่งรองรับ underscore.js
tokyovariable

4
ฉันใช้ขีดล่างและโพสต์นี้เพิ่งเตือนฉันว่าฉันไม่ได้ใช้มันเพียงพอในโครงการนี้ หากคุณจัดการกับวัตถุคุณควรมี underscore.js
jbolanos

3
ขีดล่าง> (ทั้งหมด - ['lo-dash'])
Rayjax

อันเดอร์คอร์, สิ่งที่ควรอยู่ภายใต้ js :)
minhajul

1
@Babydead เพื่อแยกแยะคุณสมบัติที่แท้จริงของวัตถุและวัตถุที่สืบทอดมา developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
ripper234

56

นี่คือโซลูชันข้ามเบราว์เซอร์ที่มากที่สุด

นี่ดีกว่าคำตอบที่ยอมรับได้เพราะใช้ Object.keys ดั้งเดิมหากมีอยู่ ดังนั้นจึงเป็นวิธีที่เร็วที่สุดสำหรับเบราว์เซอร์ที่ทันสมัยทั้งหมด

if (!Object.keys) {
    Object.keys = function (obj) {
        var arr = [],
            key;
        for (key in obj) {
            if (obj.hasOwnProperty(key)) {
                arr.push(key);
            }
        }
        return arr;
    };
}

Object.keys(obj).length;

6
Object.keys()ส่งคืนอาร์เรย์ที่มีชื่อของคุณสมบัติเหล่านั้นเท่านั้นที่นับได้ ถ้าคุณต้องการอาร์เรย์ที่มีคุณสมบัติทั้งหมดคุณควรใช้Object.getOwnPropertyNames()แทน ดูdeveloper.mozilla.org/en/docs/Web/JavaScript/Reference/
......

35

ฉันไม่ใช่ผู้เชี่ยวชาญ JavaScript แต่ดูเหมือนว่าคุณจะต้องวนรอบองค์ประกอบและนับพวกเขาเนื่องจาก Object ไม่มีวิธีความยาว:

var element_count = 0;
for (e in myArray) {  if (myArray.hasOwnProperty(e)) element_count++; }

@palmsey: ในความเป็นธรรมกับ OP เอกสาร JavaScript อย่างแท้จริงอ้างถึงการใช้ตัวแปรประเภทวัตถุในลักษณะนี้เป็น "เชื่อมโยงอาร์เรย์"


8
จะไม่ทำงานเพราะจะนับวิธีด้วยเช่นกันที่ถูกเพิ่มเข้ามาในต้นแบบ
Lajos Meszaros

30

วิธีนี้รับชื่อคุณสมบัติของวัตถุทั้งหมดในอาร์เรย์ดังนั้นคุณสามารถรับความยาวของอาร์เรย์นั้นซึ่งเท่ากับความยาวคีย์ของวัตถุของคุณ

Object.getOwnPropertyNames({"hi":"Hi","msg":"Message"}).length; // => 2

@PatrickRoberts วิธีการคีย์ไม่คืนคุณสมบัติจากสายโซ่ต้นแบบ ดังนั้นทำไมความต้องการ hasOwnProperty ที่นี่ และ getOwnProperty จะส่งคืนคุณสมบัติที่ซ่อนอยู่เนื่องจากความยาวอยู่ในอาร์เรย์เป็นต้น
Muhammad Umer

24

หากต้องการไม่ยุ่งกับต้นแบบหรือรหัสอื่นคุณสามารถสร้างและขยายวัตถุของคุณเอง:

function Hash(){
    var length=0;
    this.add = function(key, val){
         if(this[key] == undefined)
         {
           length++;
         }
         this[key]=val;
    }; 
    this.length = function(){
        return length;
    };
}

myArray = new Hash();
myArray.add("lastname", "Simpson");
myArray.add("age", 21);
alert(myArray.length()); // will alert 2

หากคุณใช้วิธีการเพิ่มคุณสมบัติความยาวจะถูกต้องเสมอ หากคุณกังวลว่าคุณหรือคนอื่น ๆ ลืมที่จะใช้มันคุณสามารถเพิ่มตัวนับคุณสมบัติที่คนอื่นโพสต์ไปยังวิธีความยาวได้เช่นกัน

แน่นอนคุณสามารถเขียนทับวิธีการได้เสมอ แต่แม้ว่าคุณทำรหัสของคุณอาจจะล้มเหลวอย่างเห็นได้ชัดทำให้ง่ายต่อการแก้ปัญหา ;)


ฉันคิดว่านี่เป็นทางออกที่ดีที่สุดเพราะไม่จำเป็นต้องวนซ้ำกับ 'for' ซึ่งอาจมีราคาสูงหากอาร์เรย์มีขนาดใหญ่
Emeka Mbah

20

นี่คือวิธีและอย่าลืมตรวจสอบว่าทรัพย์สินไม่ได้อยู่ในห่วงโซ่ต้นแบบ:

var element_count = 0;
for(var e in myArray)
    if(myArray.hasOwnProperty(e))
        element_count++;

20

เพียงใช้สิ่งนี้เพื่อรับlength:

Object.keys(myObject).length

7
โปรดอธิบายว่าคำตอบของคุณแตกต่างจากstackoverflow.com/a/6700/8632727 อย่างไร
Patata

3
คุณไม่ควรตั้งชื่อวัตถุของคุณจริงๆmyArray
Barry Michael Doyle

2
@BarryMichaelDoyle ฉันเปลี่ยนไปแล้ว :)
saurabhgoyal795

ดีมันจะดีกว่าเสมอในการตั้งชื่อตัวแปรของคุณตามสิ่งที่พวกเขาเป็นจริง ทำให้โค้ดของคุณอ่านได้ง่ายขึ้นสำหรับผู้พัฒนารายอื่น
Barry Michael Doyle

4
ก่อนที่จะแก้ไข "myArray" -> "myObject" นี่เป็นคำตอบที่ upvoted อันดับสองที่เหมือนกัน
Yunnosch

16

นี่คือทางออกที่แตกต่างอย่างสิ้นเชิงที่จะทำงานเฉพาะในเบราว์เซอร์ที่ทันสมัยกว่า (IE9 +, Chrome, Firefox 4+, Opera 11.60+, Safari 5.1+)

ดูjsFiddle

ตั้งค่าคลาส Associative Array ของคุณ

/**
 * @constructor
 */
AssociativeArray = function () {};

// Make the length property work
Object.defineProperty(AssociativeArray.prototype, "length", {
    get: function () {
        var count = 0;
        for (var key in this) {
            if (this.hasOwnProperty(key))
                count++;
        }
        return count;
    }
});

ตอนนี้คุณสามารถใช้รหัสนี้ดังนี้ ...

var a1 = new AssociativeArray();
a1["prop1"] = "test";
a1["prop2"] = 1234;
a1["prop3"] = "something else";
alert("Length of array is " + a1.length);

ฉันคิดว่ามันไม่ปลอดภัย ตัวอย่างเช่นมันไม่สามารถมีองค์ประกอบที่มีคีย์ของ "ความยาว" คำสั่ง a1 ["length"] = "Hello world"; ไม่สามารถเก็บรายการได้ นอกจากนี้ยังมีคำสั่ง a1 ["hasOwnProperty"] = "บางเสา" Totaly หยุดฟังก์ชั่น
Panos Theof

3
@PanosTheof ฉันไม่คิดว่าคุณต้องการให้มันเก็บค่าถ้าคุณใช้lengthคุณสมบัติรหัสใด ๆ ที่ใช้มันจะต้องตรวจสอบให้แน่ใจว่ามันไม่ได้ลองและเก็บกับlengthแต่ฉันเดาว่ามันจะเหมือนกันถ้ามันเป็น อาร์เรย์มาตรฐานด้วย การเอาชนะhasOwnPropertyวัตถุใด ๆ จะทำให้เกิดผลลัพธ์ที่ไม่พึงประสงค์
พันธมิตร

16

<script>
myObj = {"key1" : "Hello", "key2" : "Goodbye"};
var size = Object.keys(myObj).length;
console.log(size);
</script>

<p id="myObj">The number of <b>keys</b> in <b>myObj</b> are: <script>document.write(size)</script></p>

สิ่งนี้ใช้ได้กับฉัน:

var size = Object.keys(myObj).length;

15

สำหรับบางกรณีควรเก็บขนาดไว้ในตัวแปรแยกต่างหาก โดยเฉพาะอย่างยิ่งถ้าคุณกำลังเพิ่มไปยังอาร์เรย์โดยองค์ประกอบหนึ่งในที่เดียวและสามารถเพิ่มขนาดได้อย่างง่ายดาย เห็นได้ชัดว่ามันจะทำงานได้เร็วขึ้นมากถ้าคุณต้องการตรวจสอบขนาดบ่อยครั้ง



14

@palmsey: ในความเป็นธรรมต่อ OP เอกสาร javascript จริงอ้างถึงการใช้ตัวแปรประเภทวัตถุในลักษณะนี้เป็น "เชื่อมโยงอาร์เรย์"

และในความเป็นธรรมกับ @palmsey เขาค่อนข้างถูกต้องพวกเขาไม่ใช่อาเรย์ที่เชื่อมโยงกันพวกเขาเป็นวัตถุแน่นอน :) - ทำงานของอาเรย์ที่เชื่อมโยงกัน แต่สำหรับประเด็นที่กว้างกว่านี้คุณดูเหมือนจะมีสิทธิ์ตามที่ระบุไว้ในบทความที่ค่อนข้างดีนี้ฉันพบว่า:

JavaScript“ อาร์เรย์ที่เกี่ยวข้อง” ถือว่าเป็นอันตราย

แต่ตามที่กล่าวมาทั้งหมดคำตอบที่ได้รับการยอมรับไม่ได้เป็นสิ่งที่เลวร้ายหรือเปล่า?

ระบุขนาดต้นแบบ () ฟังก์ชั่นสำหรับวัตถุ

หากมีการเพิ่มสิ่งอื่นใน Object .prototype แล้วรหัสที่แนะนำจะล้มเหลว:

<script type="text/javascript">
Object.prototype.size = function () {
  var len = this.length ? --this.length : -1;
    for (var k in this)
      len++;
  return len;
}
Object.prototype.size2 = function () {
  var len = this.length ? --this.length : -1;
    for (var k in this)
      len++;
  return len;
}
var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
alert("age is " + myArray["age"]);
alert("length is " + myArray.size());
</script>

ฉันไม่คิดว่าคำตอบนั้นควรเป็นคำตอบที่ยอมรับได้เนื่องจากไม่น่าเชื่อถือหากคุณมีรหัสอื่น ๆ ที่ทำงานอยู่ในบริบทการดำเนินการเดียวกัน ในการทำในลักษณะที่มีความทนทานแน่นอนคุณจะต้องกำหนดวิธีการขนาดภายใน myArray และตรวจสอบประเภทของสมาชิกเมื่อคุณย้ำผ่านพวกเขา


13

หากคุณต้องการโครงสร้างข้อมูลเชื่อมโยงที่เปิดเผยขนาดควรใช้แผนที่แทนวัตถุ

const myMap = new Map();
myMap.set("firstname", "Gareth");
myMap.set("lastname", "Simpson");
myMap.set("age", 21);
myMap.size; // 3

11

อะไรประมาณนี้ -

function keyValuePairs() {
    this.length = 0;
    function add(key, value) { this[key] = value; this.length++; }
    function remove(key) { if (this.hasOwnProperty(key)) { delete this[key]; this.length--; }}
}

11

หากเรามีกัญชา

hash = {"a": "b", "c": "d"};

เราสามารถรับความยาวโดยใช้ความยาวของปุ่มซึ่งเป็นความยาวของแฮช:

คีย์ (กัญชา) .length


2
นี่คือคำตอบที่ดี แต่ฉันไม่สามารถหาเอกสารใด ๆ สำหรับฟังก์ชั่นคีย์นี้ ดังนั้นฉันจึงไม่สามารถมั่นใจได้ในการสนับสนุนข้ามเบราว์เซอร์
chim

1
น่าเสียดายที่คำตอบนี้ไม่ดีอย่างที่ฉันคิดไว้ก่อน! ปรากฎว่าฟังก์ชั่นคีย์มีเฉพาะในคอนโซลของ Chrome และ firefox เท่านั้น หากคุณใส่รหัสนี้ในสคริปต์แล้วมันจะล้มเหลวด้วย Uncaught ReferenceError: ไม่ได้กำหนดคีย์
chim


1
สิ่งนี้แตกต่างจากคำตอบของ aeosynthอย่างไร
ปีเตอร์มอร์เทนเซ่น

11
var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
  1. Object.values ​​(myObject) .length
  2. Object.entries (myObject) .length
  3. Object.keys (myObject) .length

ตัวไหนจะเร็วกว่า 3 ตัวข้างต้น
siluveru kiran kumar

Object.values ​​(myObject) .length
tdjprog

เราจะบอกได้อย่างไรว่าObject.values ​​(myObject) ความยาวเร็วขึ้นคือมีตัวอย่างใด ๆ ขอบคุณ @tdjprog
siluveru kiran kumar

ลองใช้สิ่งนี้ในคอนโซล:var myObject = {}; for (let i=0; i<10000000; i++) myObject[i] = i;
tdjprog

ทำไม Object.values ​​(myObject) .length เร็วขึ้นซึ่งเป็นObject.entries (myObject) ความยาวไม่ให้ผลลัพธ์แม้บางครั้งเหตุผลที่นี่คืออะไร ขอบคุณ @tdjprog
siluveru kiran kumar

10

หากคุณใช้AngularJS 1.x คุณสามารถทำสิ่งต่างๆได้ด้วยวิธี AngularJS โดยการสร้างตัวกรองและใช้รหัสจากตัวอย่างอื่นใด ๆ ดังต่อไปนี้:

// Count the elements in an object
app.filter('lengthOfObject', function() {
  return function( obj ) {
    var size = 0, key;
    for (key in obj) {
      if (obj.hasOwnProperty(key)) size++;
    }
   return size;
 }
})

การใช้

ในตัวควบคุมของคุณ:

$scope.filterResult = $filter('lengthOfObject')($scope.object)

หรือในมุมมองของคุณ:

<any ng-expression="object | lengthOfObject"></any>

4
OP ไม่ได้ถามรุ่น AngularJS นี่ไม่ใช่คำตอบที่ถูกต้องสำหรับคำถาม
Francisco Hodge

10

วิธีที่ง่ายที่สุดคืออย่างนี้

Object.keys(myobject).length

ที่ myobject เป็นวัตถุของสิ่งที่คุณต้องการความยาว


2
สิ่งนี้ดูเหมือนจะเป็นเพียงการทำซ้ำของคำตอบที่มีอยู่นี้
ปาง

@Pang เห็นด้วยและมันไม่ได้ให้บริบทเพิ่มเติมเหมือนคำตอบอื่น ๆ
ลึกลับ

8

หากคุณไม่สนใจเกี่ยวกับการสนับสนุน Internet Explorer 8 หรือต่ำกว่าคุณสามารถรับจำนวนคุณสมบัติในวัตถุโดยใช้สองขั้นตอนต่อไปนี้:

  1. รันObject.keys()เพื่อรับอาร์เรย์ที่มีชื่อของคุณสมบัติเหล่านั้นเท่านั้นที่สามารถนับได้หรือObject.getOwnPropertyNames()ถ้าคุณต้องการรวมชื่อของคุณสมบัติที่ไม่สามารถนับได้ด้วย
  2. รับ.lengthคุณสมบัติของอาร์เรย์นั้น

หากคุณต้องการทำสิ่งนี้มากกว่าหนึ่งครั้งคุณสามารถปิดตรรกะนี้ในฟังก์ชัน:

function size(obj, enumerablesOnly) {
    return enumerablesOnly === false ?
        Object.getOwnPropertyNames(obj).length :
        Object.keys(obj).length;
}

วิธีใช้ฟังก์ชั่นนี้:

var myObj = Object.create({}, {
    getFoo: {},
    setFoo: {}
});
myObj.Foo = 12;

var myArr = [1,2,5,4,8,15];

console.log(size(myObj));        // Output : 1
console.log(size(myObj, true));  // Output : 1
console.log(size(myObj, false)); // Output : 3
console.log(size(myArr));        // Output : 6
console.log(size(myArr, true));  // Output : 6
console.log(size(myArr, false)); // Output : 7

ดูซอนี้สำหรับการสาธิต


8

ใช้Object.keys(myObject).lengthเพื่อรับความยาวของวัตถุ / อาร์เรย์

var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

console.log(Object.keys(myObject).length); //3

8
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

console.log(Object.keys(myObject).length)

// o/p 3

7

การเปลี่ยนแปลงในบางข้อด้านบนคือ:

var objLength = function(obj){    
    var key,len=0;
    for(key in obj){
        len += Number( obj.hasOwnProperty(key) );
    }
    return len;
};

มันเป็นวิธีที่ยอดเยี่ยมกว่าในการรวม hasOwnProp


6

ต่อไปนี้เป็นคำตอบของ James Cogan รุ่นอื่น แทนที่จะส่งผ่านข้อโต้แย้งเพียงแค่สร้างคลาส Object ขึ้นมาและสร้างโค้ดให้สะอาดขึ้น

Object.prototype.size = function () {
    var size = 0,
        key;
    for (key in this) {
        if (this.hasOwnProperty(key)) size++;
    }
    return size;
};

var x = {
    one: 1,
    two: 2,
    three: 3
};

x.size() === 3;

ตัวอย่าง jsfiddle: http://jsfiddle.net/qar4j/1/


6
Object.prototype- ความคิดที่ไม่ดี
Dziad Borowy

@tborychowski คุณช่วยอธิบายได้ไหม
Mohamad

นี่คือหนึ่งบทความ: bit.ly/1droWrG ฉันไม่ได้บอกว่าจะต้องไม่ทำ แต่คุณต้องรู้ผลกระทบทั้งหมดก่อนที่จะทำ
Dziad Borowy

หากคุณกำลังจะขยายต้นแบบในตัวหรือ polyfill คุณสมบัติ (เช่น monkey-patch) โปรดทำอย่างถูกต้อง: เพื่อความเข้ากันได้ไปข้างหน้าให้ตรวจสอบว่าคุณสมบัติมีอยู่ก่อนจากนั้นทำให้คุณสมบัติไม่สามารถนับได้เพื่อให้กุญแจของตัวเอง ของวัตถุที่สร้างขึ้นจะไม่ปนเปื้อน สำหรับวิธีการใช้งานที่เกิดขึ้นจริง วิธีการ คำแนะนำของฉัน: ทำตามตัวอย่างเหล่านี้ซึ่งสาธิตวิธีการเพิ่มวิธีการทำงานที่ใกล้เคียงที่สุดเท่าที่เป็นไปได้เช่นวิธีการที่มีในตัว
user4642212

5

คุณสามารถใช้Object.keys(obj).lengthกับวัตถุใดก็ได้เพื่อให้ได้ความยาว Object.keys ส่งคืนอาร์เรย์ที่มีคีย์วัตถุทั้งหมด(คุณสมบัติ) ซึ่งสามารถเป็นประโยชน์สำหรับการค้นหาความยาวของวัตถุนั้นโดยใช้ความยาวของอาร์เรย์ที่สอดคล้องกัน คุณสามารถเขียนฟังก์ชันสำหรับสิ่งนี้ได้ รับความคิดสร้างสรรค์และเขียนวิธีการเช่นกัน (พร้อมด้วยคุณสมบัติผู้ทะเยอทะยานได้ง่ายขึ้น):

function objLength(obj)
{
  return Object.keys(obj).length;
}

console.log(objLength({a:1, b:"summit", c:"nonsense"}));

// Works perfectly fine
var obj = new Object();
obj['fish'] = 30;
obj['nullified content'] = null;
console.log(objLength(obj));

// It also works your way, which is creating it using the Object constructor
Object.prototype.getLength = function() {
   return Object.keys(this).length;
}
console.log(obj.getLength());

// You can also write it as a method, which is more efficient as done so above

Object.defineProperty(Object.prototype, "length", {get:function(){
    return Object.keys(this).length;
}});
console.log(obj.length);

// probably the most effictive approach is done so and demonstrated above which sets a getter property called "length" for objects which returns the equivalent value of getLength(this) or this.getLength()


3
สิ่งนี้แตกต่างจากคำตอบของ aeosynthอย่างไร
ปีเตอร์มอร์เทนเซ่น

มันเป็นเพราะมันแสดงให้เห็นถึงวิธีการทำให้มันเป็นฟังก์ชั่นและวิธีการวัตถุทั่วโลก (วัตถุที่มุ่งเน้นมากขึ้นและใช้รูปแบบของการห่อหุ้ม) อย่างไรก็ตามคำตอบของ aeosynthไม่ได้
ลึกลับ

หากคุณกำลังจะขยายต้นแบบในตัวหรือ polyfill คุณสมบัติ (เช่น monkey-patch) โปรดทำอย่างถูกต้อง: เพื่อความเข้ากันได้ไปข้างหน้าให้ตรวจสอบว่าคุณสมบัติมีอยู่ก่อนจากนั้นทำให้คุณสมบัติไม่สามารถนับได้เพื่อให้กุญแจของตัวเอง ของวัตถุที่สร้างขึ้นจะไม่ปนเปื้อน สำหรับวิธีการใช้งานที่เกิดขึ้นจริง วิธีการ คำแนะนำของฉัน: ทำตามตัวอย่างเหล่านี้ซึ่งสาธิตวิธีการเพิ่มวิธีการทำงานที่ใกล้เคียงที่สุดเท่าที่เป็นไปได้เช่นวิธีการที่มีในตัว
user4642212

นอกจากนี้วิธีการเขียนวิธี "มีประสิทธิภาพมากขึ้น" อย่างไร
user4642212

5

คุณสามารถทำได้Object.getOwnPropertyNames(myObject).lengthเพื่อให้ได้ผลลัพธ์เช่นเดียวกับการ[].lengthให้อาร์เรย์ปกติ


1
Object.keys()ส่งคืนอาร์เรย์ที่มีชื่อของคุณสมบัติเหล่านั้นเท่านั้นที่นับได้ ถ้าคุณต้องการอาร์เรย์ที่มีคุณสมบัติทั้งหมดคุณควรใช้Object.getOwnPropertyNames()แทน ดูdeveloper.mozilla.org/en/docs/Web/JavaScript/Reference/
......

3
สิ่งนี้แตกต่างจากคำตอบของ aeosynthอย่างไร
Peter Mortensen


4

สายไปเล็กน้อยสำหรับเกม แต่วิธีที่ดีในการทำสิ่งนี้ (IE9 + เท่านั้น) คือการกำหนดเวทมนตร์ทะเยอทะยานตามคุณสมบัติความยาว:

Object.defineProperty(Object.prototype, "length", {
    get: function () {
        return Object.keys(this).length;
    }
});

และคุณสามารถใช้มันได้เช่น:

var myObj = { 'key': 'value' };
myObj.length;

1จะให้


1
ข้อโต้แย้งเกี่ยวกับการดัดแปลงต้นแบบนอกเหนือไปจากตัวฉันเองไม่เคยมีข้อผิดพลาดเกิดขึ้นและสำหรับฉันก็เป็นหนึ่งในจุดแข็งของ JavaScript
MacroMan

3

ด้านล่างนี้เป็นคำตอบของ James Coglan ใน CoffeeScript สำหรับผู้ที่เลิกใช้ JavaScript โดยตรง :)

Object.size = (obj) ->
  size = 0
  size++ for own key of obj
  size

1
คุณอาจต้องการที่จะพูดsize++ for own key of obj( own keyเป็นไวยากรณ์น้ำตาลใน CoffeeScript) การใช้hasOwnPropertyโดยตรงจากวัตถุนั้นเป็นสิ่งที่อันตรายเนื่องจากมันจะแตกเมื่อวัตถุมีคุณสมบัติเช่นนั้น
Konrad Borowski

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