วิธีเข้าถึงคุณสมบัติแรกของวัตถุ Javascript


611

มีวิธีหรูหราในการเข้าถึงคุณสมบัติแรกของวัตถุ ...

  1. ที่ซึ่งคุณไม่รู้จักชื่อคุณสมบัติของคุณ
  2. โดยไม่ต้องใช้ลูปfor .. inLike หรือ jQuery$.each

ตัวอย่างเช่นฉันต้องการเข้าถึงfoo1วัตถุโดยไม่ทราบชื่อ foo1:

var example = {
    foo1: { /* stuff1 */},
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};

1
มันน่าจะดีกว่าถ้าเปลี่ยนเป็น Array ก่อน
cregox

คำตอบ:


1392
var obj = { first: 'someVal' };
obj[Object.keys(obj)[0]]; //returns 'someVal'

การใช้สิ่งนี้คุณสามารถเข้าถึงคุณสมบัติอื่น ๆ ด้วยดัชนี ระวังสรรพสิ่ง! Object.keysไม่รับประกันใบสั่งส่งคืนสินค้าตาม ECMAScript แต่เป็นทางการโดยการใช้งานเบราว์เซอร์ที่สำคัญทั้งหมดโปรดอ่านhttps://stackoverflow.com/a/23202095สำหรับรายละเอียดเกี่ยวกับเรื่องนี้


25
คุณบอกว่ามันไม่ใช่วิธีที่เร็วที่สุด อะไรจะเร็วขึ้น
T Nguyen

3
สิ่งนี้ไม่ได้มีประสิทธิภาพมากนักเนื่องจากมันสร้างคีย์ทั้งหมดของวัตถุทั้งหมด
Andrew Mao

9
@T เหงียนฉันจะโพสต์ไว้ถ้าฉันรู้ว่ามัน :)
Grzegorz Kaczan

5
@DavChana - คุณตั้งมาตรฐานของคุณผิด บล็อกสำเร็จรูปจะถูกดำเนินการและคุณบล็อก 2เป็นที่ว่างเปล่าหมายถึงผลแรกแสดงให้เห็นถึงการดำเนินสำเร็จรูป + block1และผลที่สองหมายถึงเพียงต้นแบบ นี่คือเกณฑ์มาตรฐานที่ถูกต้อง: http://jsben.ch/#/R9aLQแสดงให้เห็นว่าพวกเขามีความเท่าเทียมกันมาก (ทำการทดสอบหลายครั้ง)
myfunkyside

9
ฉันต้องการfirst()หรือสิ่งที่คล้ายกันสามารถจัดการกับสิ่งนี้
Fr0zenFyr

113

ลองfor … inวนซ้ำแล้วซ้ำอีกหลังจากการทำซ้ำครั้งแรก:

for (var prop in object) {
    // object[prop]
    break;
}

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

2
หากมีคนอื่นกังวลเกี่ยวกับการสั่งซื้อเบราว์เซอร์ส่วนใหญ่จะทำงานได้อย่างคาดเดาได้: stackoverflow.com/questions/280713/…
Flash

6
var prop; สำหรับ (prop ในวัตถุ) break; // object [prop]
netiul

12
คำตอบเก่า แต่ คุณอาจต้องการตรวจสอบว่าทรัพย์สินเป็นของวัตถุหรือไม่ ไลค์: สำหรับ (.. ) {ถ้า (! obj.hasOwnProperty (prop)) ดำเนินการต่อ; .... หยุดพัก; } ในกรณีที่วัตถุนั้นว่างเปล่าจริง ๆ แล้วมันไม่ได้ส่งผ่านต้นแบบหรืออะไรบางอย่าง
pgarciacamou

65

Object.values(example)[0]นอกจากนี้คุณยังสามารถทำ


ไม่สามารถใช้ได้ในทุกเบราว์เซอร์อ้างอิงstackoverflow.com/a/38748490/719689
AlxVallejo

1
ฉันชอบสิ่งนี้ดีกว่าObject.keysเพราะคุณรับประกันว่าจะได้รับไอเท็มแรก
theUtherSide

อัปเดตจากปี 2019 ฉันคิดว่ามันใช้งานได้บนเบราว์เซอร์ส่วนใหญ่ยกเว้น IE developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
......

46

ใช้Object.keysเพื่อรับอาเรย์ของคุณสมบัติบนวัตถุ ตัวอย่าง:

var example = {
    foo1: { /* stuff1 */},
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};

var keys = Object.keys(example); // => ["foo1", "foo2", "foo3"] (Note: the order here is not reliable)

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

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


25

รุ่นหนึ่งกฎ:

var val = example[function() { for (var k in example) return k }()];

2
บางครั้งอาจมีความเสี่ยงที่จะใช้for inโดยไม่ตรวจสอบhasOwnPropertyเนื่องจากวัตถุมีค่าที่ไม่ต้องการอื่น ๆ ต่อท้ายโดยทางโปรแกรมเพื่อให้คุณสามารถได้รับผลลัพธ์ที่ไม่พึงประสงค์จากตัวอย่างนี้ เพียงเพราะความสั้นและความเรียบร้อยไม่ได้หมายความว่าปลอดภัยที่สุด
Javier Cobos

24

ไม่มีคุณสมบัติ "แรก" ปุ่มวัตถุไม่ได้เรียงลำดับ

หากคุณวนรอบพวกเขาด้วยสำหรับ(var foo in bar)คุณจะได้รับพวกเขาในบางคำสั่ง แต่มันอาจมีการเปลี่ยนแปลงในอนาคต (โดยเฉพาะถ้าคุณเพิ่มหรือลบคีย์อื่น ๆ )


น่ากลัว ฉันใช้วัตถุเพื่อสร้างแผนที่ที่รักษาลำดับการแทรก นั่นจะแตกเมื่อฉันลบค่าเพราะการแทรกครั้งต่อไปเติมในช่องว่าง :(
David Harkness

2
ลำดับคีย์ / ค่าควรเก็บรักษาไว้ใน JS เวอร์ชันใหม่
Alexander Mills

11

วิธีการแก้ปัญหาด้วยlodash library:

_.find(example) // => {name: "foo1"}

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


2
เพิ่งทดสอบสิ่งนี้และมันไม่ทำงาน ส่งคืนค่าเท่านั้นไม่ใช่คู่ของคีย์ / ค่า
Chris Haines

2
ไม่มีการกล่าวถึงในคำถามว่าควรส่งคืนคู่คีย์ / ค่าเขาเพียงแค่ถามหาวัตถุและคำตอบที่ยอมรับนั้นทำหน้าที่ได้มากเท่ากับฟังก์ชั่น lodash: มันจะส่งคืนเนื้อหาของคุณสมบัติแรก อาจไม่เหมาะกับความต้องการเฉพาะของคุณ แต่คำตอบนี้ถูกต้องตามคำถามเดิม
Carrm

ใช่งานมีประโยชน์เมื่อคุณรู้ว่าวัตถุของคุณจะมีเพียงวัตถุลูกเดียวvar object = { childIndex: { .. } }; var childObject = _.find(Object);
Raja Khoury

9

ไม่วัตถุตามตัวอักษรตามที่กำหนดโดยMDCคือ:

รายการชื่อคุณสมบัติศูนย์หรือมากกว่าหนึ่งคู่และค่าที่เกี่ยวข้องของวัตถุที่อยู่ในเครื่องหมายปีกกา ({})

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


25
สำหรับคนอื่น ๆ ที่เห็นเพียงเครื่องหมายขีดสีเขียวในคำตอบนี้มีวิธีแก้ไขปัญหาอื่น ๆ เพิ่มเติมในหน้านี้ที่มีผู้ลงคะแนนมากกว่า 350 คน
redfox05

7

คำตอบยอดนิยมสามารถสร้างอาร์เรย์ทั้งหมดแล้วจับภาพจากรายการ นี่เป็นอีกหนึ่งทางลัดที่มีประสิทธิภาพ

var obj = { first: 'someVal' };
Object.entries(obj)[0][1] // someVal

3

สิ่งนี้ได้ถูกกล่าวถึงก่อนหน้านี้

แนวคิดเรื่องแรกไม่ได้ใช้กับคุณสมบัติของวัตถุและลำดับของ a สำหรับ ... ในลูปไม่ได้รับการรับรองโดยสเป็คอย่างไรก็ตามในทางปฏิบัติมันเป็นที่เชื่อถือได้ FIFO ยกเว้นช่วงวิกฤตสำหรับโครเมียม ( รายงานบั๊ก ) ตัดสินใจตามความเหมาะสม


3

ฉันไม่แนะนำให้คุณใช้ Object.keys เนื่องจากไม่รองรับใน IE เวอร์ชันเก่า แต่ถ้าคุณต้องการสิ่งนั้นจริงๆคุณสามารถใช้รหัสด้านบนเพื่อรับประกันความเข้ากันได้ด้านหลัง:

if (!Object.keys) {
Object.keys = (function () {
var hasOwnProperty = Object.prototype.hasOwnProperty,
    hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
    dontEnums = [
      'toString',
      'toLocaleString',
      'valueOf',
      'hasOwnProperty',
      'isPrototypeOf',
      'propertyIsEnumerable',
      'constructor'
    ],
    dontEnumsLength = dontEnums.length;

return function (obj) {
  if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');

  var result = [];

  for (var prop in obj) {
    if (hasOwnProperty.call(obj, prop)) result.push(prop);
  }

  if (hasDontEnumBug) {
    for (var i=0; i < dontEnumsLength; i++) {
      if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
    }
  }
  return result;
}})()};

คุณสมบัติ Firefox (Gecko) 4 (2.0) Chrome 5 Internet Explorer 9 Opera 12 Safari 5

ข้อมูลเพิ่มเติม: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys

แต่ถ้าคุณต้องการเพียงอันแรกเราสามารถจัดการวิธีแก้ปัญหาให้สั้นกว่าเช่น:

var data = {"key1":"123","key2":"456"};
var first = {};
for(key in data){
    if(data.hasOwnProperty(key)){
        first.key = key;
        first.content =  data[key];
        break;
    }
}
console.log(first); // {key:"key",content:"123"}

2

ในการรับชื่อคีย์ในวัตถุคุณสามารถใช้:

var obj = { first: 'someVal' };
Object.keys(obj)[0]; //returns 'first'

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

var obj = { first: { someVal : { id : 1} }; ที่นี่ด้วยโซลูชันนั้นคุณไม่สามารถเข้าถึง ID

ทางออกที่ดีที่สุดหากคุณต้องการได้วัตถุจริงคือใช้ lodash เช่น:

obj[_.first(_.keys(obj))].id

ในการส่งคืนค่าของคีย์แรก (หากคุณไม่รู้ชื่อคีย์แรกอย่างแน่นอน):

var obj = { first: 'someVal' };
obj[Object.keys(obj)[0]]; //returns 'someVal'

ถ้าคุณรู้ชื่อคีย์เพียงใช้:

obj.first

หรือ

obj['first']

0

หากคุณต้องการเข้าถึง "คุณสมบัติแรกของวัตถุ" อาจหมายถึงว่ามีบางอย่างผิดปกติกับตรรกะของคุณ ลำดับของคุณสมบัติของวัตถุไม่ควรสำคัญ


คุณถูก. ฉันไม่ต้องการคนแรกต่อ se แต่เพียงหนึ่งในคุณสมบัติ foo เพื่อให้ฉันสามารถทำงานกับมัน ฉันต้องการเพียงหนึ่งและไม่แน่ใจว่ามีวิธีที่จะคว้าหนึ่ง "คนแรก" โดยไม่ต้องใช้เพื่อ ... มา
5252 atogle

0

ใช้อาร์เรย์แทนวัตถุ (วงเล็บเหลี่ยม)

var example = [ {/* stuff1 */}, { /* stuff2 */}, { /* stuff3 */}];
var fist = example[0];

โปรดทราบว่าคุณสูญเสียตัวระบุ 'foo' แต่คุณสามารถเพิ่มคุณสมบัติชื่อไปยังวัตถุที่มีอยู่:

var example = [ 
  {name: 'foo1', /* stuff1 */},
  {name: 'foo2', /* stuff2 */},
  {name: 'foo3', /* stuff3 */}
];
var whatWasFirst = example[0].name;

มีสถานการณ์ที่เราทำไม่ได้ เราสมมติว่าเราไม่สามารถเปลี่ยนความจริงที่ว่าพวกเขาไม่ได้อยู่ในอาร์เรย์
1mike12

1
ฉันคิดว่ามันมีประโยชน์ที่จะผลักดันการออกแบบเล็กน้อยสำหรับผู้อ่านที่สามารถควบคุมสคีมา JSON ของพวกเขาได้ โดยพื้นฐานแล้วฉันกำลังขยายคำตอบของ Flavius ​​Stef ด้วยตัวอย่าง
steamer25


0

คุณสามารถใช้Object.prototype.keysซึ่งส่งคืนคีย์ทั้งหมดของวัตถุในลำดับเดียวกัน ดังนั้นถ้าคุณต้องการวัตถุแรกแค่รับอาร์เรย์นั้นและใช้องค์ประกอบแรกเป็นคีย์ที่ต้องการ

const o = { "key1": "value1", "key2": "value2"};
const idx = 0; // add the index for which you want value
var key = Object.keys(o)[idx];
value = o[key]
console.log(key,value); // key2 value2

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

0

เราสามารถทำอย่างไรกับ approch นี้

var example = {
  foo1: { /* stuff1 */},
  foo2: { /* stuff2 */},
  foo3: { /* stuff3 */}
}; 
Object.entries(example)[0][1];

0

นี่เป็นวิธีที่สะอาดกว่าในการรับคีย์แรก:

var example = {
    foo1: { /* stuff1 */},
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};

var object2 = {
    needThis: 'This is a value of the property',
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};

let [first] = Object.keys(example)
let [firstProp] = Object.keys(object2)

console.log(first)
//Prop : needThis, Value: This is a value of the property
console.log(`Prop : ${firstProp}, Value: ${object2[firstProp]}`)


[first]แต่ทำไมรอบอาร์เรย์ ผู้ใช้ไม่ได้ร้องขออาร์เรย์เป็นคำตอบ ทำสิ่งนี้มากกว่าfirst = Object.keys(example)[0]ซึ่งจะทำแบบเดียวกันโดยไม่จำเป็นต้องห่อคำตอบลงในอาร์เรย์ ทำไมคุณถึงสะอาดกว่า
Michael Durrant

นั่นคือการกำหนด destructuring developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Ntiyiso Rikhotso
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.