รับดัชนีแรกของวัตถุ


201

พิจารณา:

var object = {
  foo: {},
  bar: {},
  baz: {}
}

ฉันจะทำสิ่งนี้อย่างไร:

var first = object[0];
console.log(first);

เห็นได้ชัดว่าไม่ได้เพราะดัชนีแรกเป็นชื่อไม่ได้foo0

console.log(object['foo']);

ใช้งานได้ แต่ฉันไม่รู้ว่าชื่อฟู มันสามารถตั้งชื่ออะไรก็ได้ ฉันแค่ต้องการแรก

คำตอบ:


61

หากลำดับของวัตถุมีความสำคัญคุณควรแก้ไข JSON schema ของคุณเพื่อจัดเก็บวัตถุในอาร์เรย์:

[
    {"name":"foo", ...},
    {"name":"bar", ...},
    {"name":"baz", ...}
]

หรืออาจจะ:

[
    ["foo", {}],
    ["bar", {}],
    ["baz", {}]
]

เมื่อ Ben Alpert ชี้ให้เห็นว่าคุณสมบัติของวัตถุ Javascript ไม่มีการเรียงลำดับและรหัสของคุณจะเสียหายหากคุณคาดว่าวัตถุเหล่านั้นจะแจกแจงตามลำดับเดียวกับที่ระบุไว้ในตัวอักษรของวัตถุ - ไม่มีคุณสมบัติ "แรก"


6
ฉันไม่เคยเห็น (ฉันอยู่ใน obj) ทำสิ่งต่าง ๆ ในลำดับที่แตกต่างกันคุณกำลังบอกว่าบางครั้งสำหรับ (i ใน obj) จะเตะสิ่งต่าง ๆ ตามลำดับที่แตกต่างกันหรือไม่?
ไรอันใน

4
เป็นไปได้ว่ามันจะ รายละเอียดบอกว่าไม่จำเป็นต้องแจกแจงตามลำดับที่ระบุ คำสั่งนี้อาจเปลี่ยนแปลงได้
PatrikAkerstrand

5
เบราว์เซอร์ส่วนใหญ่สมัยนี้รักษาลำดับการแทรก แต่ก็ไม่ได้เป็นเช่นนั้นเสมอไป ไม่จำเป็นต้องใช้สเปคและมี Chrome รุ่นล่าสุดที่ไม่รักษาลำดับการแทรก
ไมล์

1
เมื่อฉันได้ลึกลงไปในสิ่งที่ฉันทำตามลำดับสิ่งต่าง ๆ ก็มีความสำคัญมากกว่า (ฉันคิดว่าฉันแค่ใส่ใจเรื่องแรก แต่ฉันผิด!) ดังนั้นมันจึงชัดเจนว่าเก็บวัตถุของฉันไว้ในชุดตามที่คุณแนะนำ
Ryan Florence

1
หากคุณรู้ว่าวัตถุนั้นมีองค์ประกอบเดียวคุณก็จะรู้ลำดับ
danorton

329

เพื่อความสนุกนี่ใช้งานได้ใน JS 1.8.5

var obj = {a: 1, b: 2, c: 3};
Object.keys(obj)[0]; // "a"

คำสั่งนี้ตรงกับลำดับเดียวกันกับที่คุณเห็น

for (o in obj) { ... }

24
เคลียร์ตัวเลือกที่ดีที่สุดยกเว้นว่าจำเป็นต้องใช้ความเข้ากันได้ของ backword ในยุคหิน
Dag Sondre Hansen

1
คำตอบที่ดีที่สุด 100% นี่เป็นวิธีที่ง่ายที่สุดและเร็วที่สุดในการทำเช่นนี้
คดี

3
เพื่อชี้แจงให้ชัดเจนตามen.wikipedia.org/wiki/JavaScript#Version_history JS 1.8.5 ไม่รองรับ IE9 น่าเสียดายที่หลายคนยังอยู่ในยุคหิน
Noremac

เยี่ยมมาก สั้นและเรียบง่าย ขอบคุณ @Jacob
Sariban D'Cl

ถ้ามีคนใช้ IE9 ฉันรู้สึกเจ็บปวด ขอบคุณนี่น่าทึ่ง
CMS

204

หากคุณต้องการสิ่งที่กระชับลอง:

for (first in obj) break;

alert(first);

ห่อเป็นฟังก์ชั่น:

function first(obj) {
    for (var a in obj) return a;
}

8
ดูคำตอบของ Luke Schafer ด้านล่างโดยใช้วิธีการ hasOwnProperty เพื่อให้แน่ใจว่าคุณไม่ได้คว้าสมาชิกต้นแบบ
รหัสผู้บัญชาการ

3
เพื่อให้หนึ่งซับทำงานในเบราว์เซอร์ทั้งหมดรวมถึงการใช้ IE8 และด้านล่างfor (var key in obj) if (obj.hasOwnProperty(key)) break;คุณจะต้องการใช้keyตัวแปร
Ally

ไม่ทำงานหากองค์ประกอบแรกเป็นประเภทวัตถุ ส่งคืน 0
หิมะ

Object.keys(obj)[0];เร็วกว่า (0.072ms) มากกว่าfor(1.644ms)
Sebastian Ortmann

77

พวกเขาไม่ได้สั่งจริงๆแต่คุณสามารถทำได้:

var first;
for (var i in obj) {
    if (obj.hasOwnProperty(i) && typeof(i) !== 'function') {
        first = obj[i];
        break;
    }
}

.hasOwnProperty()เป็นสิ่งสำคัญที่จะไม่สนใจวัตถุต้นแบบ


มีข้อผิดพลาดในรหัสด้านบน การตรวจสอบ typeof ควรเป็น typeof (i)
jacob.toye

@Napalm เขาอ้างถึงข้อผิดพลาดในชื่อตัวแปรที่กำลังตรวจสอบไม่ใช่ไวยากรณ์ คุณพูดถูก แต่คนจำนวนมากชอบถ่ายคร่อมความสามารถในการอ่าน
ลุคเชเฟอร์เฟอร์

ขอบคุณ. มันน่าทึ่ง.
Santosh

76

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

myObject[Object.keys(myObject)[0]]

39

สำหรับคีย์แรกของวัตถุที่คุณสามารถใช้ได้

console.log(Object.keys(object)[0]);//print key's name

สำหรับค่า

console.log(object[Object.keys(object)[0]]);//print key's value

18

ไม่มีวิธีที่จะได้รับองค์ประกอบแรกเนื่องจาก "hash" (วัตถุ) ใน JavaScript มีคุณสมบัติที่ไม่ได้เรียงลำดับ ทางออกที่ดีที่สุดของคุณคือการเก็บกุญแจไว้ในอาร์เรย์:

var keys = ["foo", "bar", "baz"];

จากนั้นใช้สิ่งนั้นเพื่อรับค่าที่เหมาะสม:

object[keys[0]]

16

ES6

const [first] = Object.keys(obj)

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

1
มันเป็นงานที่มอบหมาย destructuring โดยพื้นฐานแล้วมันจะกำหนดองค์ประกอบแรกของอาร์เรย์ที่ส่งคืนไปยังตัวแปรภายในวงเล็บเหลี่ยม
Richard Ayotte

12

การใช้เครื่องหมายขีดล่างคุณสามารถใช้ _.pairs เพื่อรับรายการวัตถุแรกเป็นคู่ของค่าคีย์ดังนี้:

_.pairs(obj)[0]

จากนั้นคีย์จะพร้อมใช้งานด้วยตัว[0]ห้อยเพิ่มเติมค่าด้วย[1]


ทำงานได้ดีที่สุดเมื่อใช้ underscore.js สิ่งที่ฉันต้องการ ... ขอบคุณจอร์จ!
Goldengalaxy

10

ฉันมีปัญหาเดียวกันเมื่อวานนี้ ฉันแก้ไขมันเช่นนี้

var obj = {
        foo:{},
        bar:{},
        baz:{}
    },
   first = null,
   key = null;
for (var key in obj) {
    first = obj[key];
    if(typeof(first) !== 'function') {
        break;
    }
}
// first is the first enumerated property, and key it's corresponding key.

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


1
สวัสดี @PatrikAkerstrand เร็ว ๆ นี้ฉันได้คลิกโดยไม่ได้ตั้งใจ กรุณาทำการเปลี่ยนแปลงใด ๆ ใน anwser ของคุณเพื่อฉันเลิกทำ ขอโทษ
rogeriolino

7

คุณสามารถทำสิ่งนี้:

var object = {
    foo:{a:'first'},
    bar:{},
    baz:{}
}


function getAttributeByIndex(obj, index){
  var i = 0;
  for (var attr in obj){
    if (index === i){
      return obj[attr];
    }
    i++;
  }
  return null;
}


var first = getAttributeByIndex(object, 0); // returns the value of the
                                            // first (0 index) attribute
                                            // of the object ( {a:'first'} )

6

เพื่อรับคีย์แรกของวัตถุของคุณ

const myObject = {
   'foo1': { name: 'myNam1' },
   'foo2': { name: 'myNam2' }
}

const result = Object.keys(myObject)[0];

// result will return 'foo1'

คำตอบนี้มีความแตกต่างอะไรกับยาโคบ?
YakovL

มันช่วยให้มั่นใจยิ่งขึ้นว่าโค้ดชนิดนี้ทำงานได้อย่างสมบูรณ์
Santosh

5

ขึ้นอยู่กับCMS คำตอบ ฉันไม่ได้รับค่าโดยตรง แต่ฉันเอากุญแจไปที่ดัชนีและใช้สิ่งนี้เพื่อรับค่า:

Object.keyAt = function(obj, index) {
    var i = 0;
    for (var key in obj) {
        if ((index || 0) === i++) return key;
    }
};


var obj = {
    foo: '1st',
    bar: '2nd',
    baz: '3rd'
};

var key = Object.keyAt(obj, 1);
var val = obj[key];

console.log(key); // => 'bar'
console.log(val); // => '2nd'

2

ทางออกของฉัน:

Object.prototype.__index = function(index)
{
    var i = -1;
    for (var key in this)
    {
        if (this.hasOwnProperty(key) && typeof(this[key])!=='function')
            ++i;
        if (i >= index)
            return this[key];
    }
    return null;
}
aObj = {'jack':3, 'peter':4, '5':'col', 'kk':function(){alert('hell');}, 'till':'ding'};
alert(aObj.__index(4));

12
เป็นคนดีเพียง ... สไตล์การเขียนโค้ดของคุณ! สิ่งที่นรก เครื่องมือจัดฟันเหล่านั้นอยู่ทุกที่!
แกะบินได้

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