รับขนาดของวัตถุ json


234

ฉันมีวัตถุ JSON ที่ได้รับกลับมาจากคำขอ AJAX และฉันมีปัญหาบางอย่างกับเพราะมันทำให้กลับมา.length undefinedแค่สงสัยว่าฉันใช้ถูกต้องหรือไม่:

console.log(data.length);
console.log(data.phones.length);

พวกเขาทั้งสองกลับมาundefinedแม้ว่าพวกเขาจะเป็นวัตถุที่ถูกต้อง

อัพเดต:
ตัวอย่างของอ็อบเจ็กต์ JSON ที่ส่งคืน:

{"reqStatus":true,"phones":{"one":{"number":"XXXXXXXXXX","type":"mobile"},"two":{"number":"XXXXXXXXXX","type":"mobile"}}}

คุณสามารถโพสต์ตัวอย่างของ JSON ที่ส่งคืนได้หรือไม่
Joe

ฉันไม่แน่ใจไม่ใช่ฉัน ฉันคิดว่าคำถามของคุณก็ดีเช่นกัน
Joe

คำตอบ:


555

คุณสามารถใช้สิ่งนี้

<script type="text/javascript">

  var myObject = {'name':'Kasun', 'address':'columbo','age': '29'}

  var count = Object.keys(myObject).length;
  console.log(count);
</script>

62
@Matt มันไม่ได้บังคับให้ทุกรหัสทำงานใน IE 7 หรือ 8 แพลตฟอร์มที่ไม่ได้มาตรฐานหรือไม่ได้รับการป้องกันเหล่านี้เป็นข้อเสียเปรียบเพียงอย่างเดียว
Olofu Mark

5
@OlofuMark ไม่ใช่ทุกคนที่เลือกเบราว์เซอร์ที่ใช้ (เช่นเครือข่ายที่ถูกล็อคการอ้างอิง IE DLLs ที่ใช้โดยแอปพลิเคชันภายใน) ถ้ารองรับเบราว์เซอร์ที่ล้าสมัยต้องใช้ความพยายามอย่างมีนัยสำคัญแล้วไม่สนใจพวกเขาสามารถเป็นธรรม แต่ในกรณีดังกล่าวเล็กน้อยเช่นนี้มันเป็นเพียงแค่หยาบไม่
tomfumb

7
@OlofuMark แม้ว่าจะไม่จำเป็นต้องสนับสนุนเวอร์ชันเหล่านั้นนักพัฒนาควรรู้เมื่อรหัสที่พวกเขาสร้างจะไม่ทำงานในบางรุ่นเพื่อให้พวกเขาสามารถตัดสินใจได้ว่าจะคำนึงถึงสิ่งนั้นหรือไม่
David Navarre

ยินดีที่ได้เห็นวิธีแก้ไขปัญหาที่ไม่ต้องการให้ JSON มีอาร์เรย์ที่ซ้อนกัน ฉันคิดว่าจุดทั้งหมดของ JSON คือการมีทุกสิ่งเป็นวัตถุ
Healforgreen

มันเป็นทางออกที่ยอดเยี่ยมที่จะทำให้วัตถุ json มีความยาว
Shaymol Bapary

54

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

  1. เปลี่ยนโครงสร้าง JSON ของคุณ (สมมติว่าเป็นไปได้) เพื่อให้ 'โทรศัพท์' กลายเป็น

    "phones":[{"number":"XXXXXXXXXX","type":"mobile"},{"number":"XXXXXXXXXX","type":"mobile"}]

    (โปรดทราบว่าไม่มีตัวระบุหมายเลขคำสำหรับโทรศัพท์แต่ละเครื่องเนื่องจากถูกส่งคืนในอาเรย์แบบ 0 ดัชนี) ในการตอบสนองนี้phones.lengthจะถูกต้อง

  2. วนซ้ำวัตถุที่อยู่ในโทรศัพท์ของคุณและนับตามที่คุณไปเช่น

    var key, count = 0;
    for(key in data.phones) {
      if(data.phones.hasOwnProperty(key)) {
        count++;
      }
    }
    

หากคุณกำหนดเป้าหมายเฉพาะเบราว์เซอร์ใหม่ตัวเลือก 2 อาจมีลักษณะเช่นนี้


ฉันจะได้รับความยาวของวัตถุ JSON ด้วยวิธีแก้ปัญหาแรกเพราะวัตถุ JSON ของฉันถูกเก็บไว้ในตัวแปรที่เรียกว่า jsonObject และฉันมี JSON เดียวกันกับด้านบน: "โทรศัพท์": [{"หมายเลข": "XXXXXXXXXXX" "พิมพ์": "โทรศัพท์มือถือ"}, { "จำนวน": "XXXXXXXXXX", "type": "โทรศัพท์มือถือ"}]
เอริค

29

พิจารณาใช้underscore.js มันจะช่วยให้คุณตรวจสอบขนาดเช่นว่า:

var data = {one : 1, two : 2, three : 3};
_.size(data);
//=> 3
_.keys(data);
//=> ["one", "two", "three"]
_.keys(data).length;
//=> 3

24

คุณไม่จำเป็นต้องเปลี่ยนรูปแบบ JSON ของคุณ

แทนที่:

console.log(data.phones.length);

ด้วย:

console.log( Object.keys( data.phones ).length ) ;

16
var json=[{"id":"431","code":"0.85.PSFR01215","price":"2457.77","volume":"23.0","total":"565.29"},{"id":"430","code":"0.85.PSFR00608","price":"1752.45","volume":"4.0","total":"70.1"},{"id":"429","code":"0.84.SMAB00060","price":"4147.5","volume":"2.0","total":"82.95"},{"id":"428","code":"0.84.SMAB00050","price":"4077.5","volume":"3.0","total":"122.32"}] 
var obj = JSON.parse(json);
var length = Object.keys(obj).length; //you get length json result 4

2
นี่เป็นวัตถุ json ที่แจงแล้ว หากคุณดำเนินการข้อความข้างต้นมันจะให้ข้อผิดพลาด 'โทเค็นที่ไม่คาดคิดใน Json' สำหรับการคำนวณความยาวของ json คุณสามารถทำได้โดยตรง var length = Object.keys (json) .length
Aayushi


-3

ใช้อันนี้

//for getting length of object
 int length = jsonObject.length();

หรือ

//for getting length of array
 int length = jsonArray.length();

6
length () ไม่ใช่ funtion วัตถุ JSON
Sunding Wei

-5
$(document).ready(function () {
    $('#count_my_data').click(function () {
        var count = 0;
        while (true) {
             try {
                var v1 = mydata[count].TechnologyId.toString();
                count = count + 1;
            }
            catch (e)
            { break; }
        }
        alert(count);
    });
});

1
การรอข้อยกเว้นเพื่อบอกคุณว่ารายการของคุณหมดองค์ประกอบเป็นความคิดที่ไม่ดีและวิธีการนี้จะให้จำนวนที่ไม่ถูกต้องหากองค์ประกอบใด ๆ (แม้ในที่สุด) ขาดTechnologyIdคุณสมบัติ
tomfumb

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