Lấy chỉ số đầu tiên của một đối tượng


201

Xem xét:

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

Làm thế nào tôi có thể làm điều này:

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

Rõ ràng, điều đó không hoạt động vì chỉ số đầu tiên được đặt tên foo, không 0.

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

hoạt động, nhưng tôi không biết nó có tên là foo. Nó có thể được đặt tên bất cứ điều gì. Tôi chỉ muốn đầu tiên.

Câu trả lời:


61

Nếu thứ tự của các đối tượng là đáng kể, bạn nên sửa lại lược đồ JSON của mình để lưu trữ các đối tượng trong một mảng:

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

hoặc có thể:

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

Như Ben Alpert chỉ ra, các thuộc tính của các đối tượng Javascript không được sắp xếp theo thứ tự và mã của bạn sẽ bị hỏng nếu bạn mong muốn chúng liệt kê theo thứ tự mà chúng được chỉ định trong đối tượng theo nghĩa đen không có thuộc tính "đầu tiên".


6
Tôi chưa bao giờ thấy (tôi trong obj) làm mọi việc theo một trật tự khác, bạn có nói rằng đôi khi vì (tôi trong obj) sẽ đá mọi thứ theo một thứ tự khác không?
Ryan Florence

4
Có thể là nó sẽ như vậy. Thông số kỹ thuật nói rằng nó không phải được liệt kê theo một thứ tự cụ thể. Điều này khá nhiều có nghĩa là thứ tự đó có thể thay đổi.
PatrikAkerstrand

5
Hầu hết các trình duyệt ngày nay đều giữ nguyên thứ tự chèn, nhưng không phải lúc nào cũng như vậy; thông số kỹ thuật không yêu cầu và có các phiên bản Chrome gần đây không duy trì thứ tự chèn.
Miles

1
Khi tôi đi sâu hơn vào những gì tôi đang làm, thứ tự của mọi thứ trở nên quan trọng hơn (tôi nghĩ rằng tôi chỉ quan tâm đến cái đầu tiên, nhưng tôi đã sai!) Vì vậy rõ ràng là lưu trữ các đối tượng của tôi trong một mảng như bạn đã đề xuất.
Ryan Florence

1
Nếu bạn biết rằng đối tượng chỉ có một phần tử, thì bạn đã biết thứ tự.
danorton

329

Chỉ để giải trí, công việc này hoạt động trong JS 1.8.5

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

Điều này khớp với thứ tự mà bạn sẽ thấy

for (o in obj) { ... }

24
Cleary tùy chọn tốt nhất trừ khi yêu cầu tương thích backword thời kỳ đồ đá.
Dag Sondre Hansen

1
100% câu trả lời tốt nhất. Đây là cách dễ nhất và nhanh nhất để làm điều này.
Trường hợp

3
Chỉ cần làm rõ, theo en.wikipedia.org/wiki/JavaScript#Version_history JS 1.8.5 không được hỗ trợ trước IE9. Thật không may, nhiều người vẫn còn trong thời kỳ đồ đá.
Noremac

Tuyệt vời Ngắn gọn và đơn giản. Cảm ơn
@Jacob

nếu ai đó đang sử dụng IE9, tôi cảm thấy đau. cảm ơn điều này thật tuyệt vời
CMS

204

Nếu bạn muốn một cái gì đó súc tích hãy thử:

for (first in obj) break;

alert(first);

bọc như một chức năng:

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

8
Xem câu trả lời của Luke Schafer bên dưới, nó sử dụng phương thức hasOwnProperty để đảm bảo bạn không lấy các thành viên nguyên mẫu.
Chỉ huy mã

3
Để một lớp lót hoạt động trong tất cả các trình duyệt bao gồm IE8 trở xuống, for (var key in obj) if (obj.hasOwnProperty(key)) break;bạn sẽ muốn sử dụng keybiến
Ally

không hoạt động nếu phần tử đầu tiên là một loại đối tượng. trả về 0
tuyết

Object.keys(obj)[0];nhanh hơn nhiều (0,072ms) so với for(1.644ms).
Sebastian Ortmann

77

họ không thực sự ra lệnh, nhưng bạn có thể làm:

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

điều .hasOwnProperty()quan trọng là bỏ qua các đối tượng nguyên mẫu.


Có một lỗi trong mã trên. Kiểm tra typeof phải là typeof (i)
jacob.toye

@Napalm anh đang đề cập đến lỗi trong tên biến được kiểm tra, không phải cú pháp. Bạn nói đúng, nhưng nhiều người thích khung để dễ đọc
Luke Schafer

Cảm ơn bạn. Ngạc nhiên.
Santosh

76

Điều này sẽ không cung cấp cho bạn cái đầu tiên vì các đối tượng javascript không được sắp xếp, tuy nhiên điều này vẫn ổn trong một số trường hợp.

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

39

cho khóa đầu tiên của đối tượng bạn có thể sử dụng

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

cho giá trị

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

18

Không có cách nào để có được phần tử đầu tiên, xem là "băm" (các đối tượng) trong JavaScript có các thuộc tính không được sắp xếp. Đặt cược tốt nhất của bạn là lưu trữ các khóa trong một mảng:

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

Sau đó sử dụng để có được giá trị thích hợp:

object[keys[0]]

16

ES6

const [first] = Object.keys(obj)

Nó hoạt động, nhưng bạn có thể vui lòng giải thích làm thế nào điều này hoạt động? Chỉ hiển thị mã không làm cho tôi hiểu nó.
Daan

1
Đó là một nhiệm vụ hủy diệt . Về cơ bản, nó gán phần tử đầu tiên của mảng được trả về cho biến trong dấu ngoặc vuông.
Richard Ayotte

12

Sử dụng dấu gạch dưới, bạn có thể sử dụng _.pairs để nhận mục nhập đối tượng đầu tiên dưới dạng cặp giá trị khóa như sau:

_.pairs(obj)[0]

Sau đó, khóa sẽ có sẵn với một [0]chỉ mục phụ, giá trị với[1]


Hoạt động tốt nhất khi underscore.js được sử dụng. Chỉ cần những gì tôi cần ... Cảm ơn bạn, George!
Goldengal Wax

10

Tôi đã có cùng một vấn đề ngày hôm qua. Tôi đã giải quyết nó như thế này:

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.

Không phải là giải pháp tao nhã nhất và tôi khá chắc chắn rằng nó có thể mang lại kết quả khác nhau trong các trình duyệt khác nhau (tức là thông số kỹ thuật nói rằng không cần phải liệt kê để liệt kê các thuộc tính theo đúng thứ tự như đã xác định). Tuy nhiên, tôi chỉ có một tài sản duy nhất trong đối tượng của mình nên đó không phải là vấn đề. Tôi chỉ cần chìa khóa đầu tiên.


1
Xin chào @PatrikAkerstrand sớm Tôi đã vô tình nhấp vào downvote. Vui lòng thực hiện bất kỳ thay đổi trong anwser của bạn để tôi hoàn tác nó. Lấy làm tiếc.
rogeriolino

7

Bạn có thể làm một cái gì đó như thế này:

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

Để có được khóa đầu tiên của đối tượng của bạn

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

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

// result will return 'foo1'

Sự khác biệt của câu trả lời này với câu trả lời của Jacob là gì?
YakovL

nó mang lại sự tự tin cho người mới rằng loại mã này hoạt động hoàn hảo.
Santosh

5

Dựa trên câu trả lời của CMS . Tôi không nhận được giá trị trực tiếp, thay vào đó tôi lấy khóa tại chỉ mục của nó và sử dụng giá trị này để nhận giá trị:

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

Giải pháp của tôi:

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
một trong những tốt đẹp, chỉ có phong cách mã hóa của bạn! cái quái gì thế? những cái niềng răng ở khắp mọi nơi!
cừu bay

2
Bạn có biết phong cách trăn? Tôi chỉ cần thêm niềng răng thẳng hàng vào phong cách python. Dù sao, "Địa ngục là người khác", :-D
nghĩa tự làm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.