Truy cập thuộc tính Đối tượng không phải số theo chỉ mục?


88

Nếu tôi có một mảng như thế này:

var arr = ['one','two','three'];

Tôi có thể truy cập các phần khác nhau bằng cách thực hiện điều này:

console.log(arr[1]);

Làm thế nào tôi có thể truy cập các thuộc tính đối tượng theo thứ tự của chúng thay vì theo khóa?

Thí dụ:

var obj = {
    'something' : 'awesome',
    'evenmore'  : 'crazy'
},
jbo = {
    'evenmore'  : 'crazy',
    'something' : 'awesome'
};

Làm cách nào để lấy thuộc tính đầu tiên cho mỗi đối tượng– "something" từ objvà "thậm chí" từ jbo–mà không sử dụng tên thuộc tính một cách rõ ràng?

Bây giờ, một số bạn dường như nghĩ rằng tôi đang theo đuổi những thứ như:

console.log(obj['something']);

Đây không phải là trường hợp, tôi đặc biệt đang tìm cách nhắm mục tiêu chỉ mục, giống như ví dụ đầu tiên - nếu có thể.


2
Bạn hiểu "mảng đối tượng" là gì. Một mảng một đối tượng. Bạn có nghĩa là chỉ một đối tượng không phải là một mảng, hay bạn có nghĩa là một mảng các đối tượng. Và jQuery ảnh hưởng đến câu hỏi của bạn như thế nào? Ví dụ mã duy nhất của bạn minh họa phần mà bạn đã biết cách làm. Làm thế nào về việc đưa ra một số mã minh họa vấn đề .
user113716

@ Ӫ _._ Ӫ Lý do tôi gắn thẻ jQuery là để có được lượng người xem rộng hơn, tôi nghĩ rằng bất kỳ ai biết jQuery đều phải hiểu về mảng, không mâu thuẫn với câu hỏi của tôi, đó là nội dung sách giáo khoa.
daryl

4
Trên thực tế, tôi muốn nói rằng có nhiều người "biết" jQuery và không biết JavaScript hơn là ngược lại (ít nhất những người biết JavaScript sẽ có thể hiểu jQuery dễ dàng) .... và đối với câu hỏi thực tế của bạn: Không, bạn không thể truy cập thuộc tính objec theo chỉ mục. Họ không được đặt hàng.
Felix Kling 23/10/11

2
"... Tôi nghĩ rằng bất kỳ ai biết jQuery đều phải hiểu về mảng ..." Tôi sẽ không đặt cược vào nó.
dùng113716

1
@Brogrammer: câu hỏi này không liên quan gì đến jQuery, vì vậy thẻ jQuery không phù hợp.
outis

Câu trả lời:


125

"Tôi đặc biệt đang tìm cách nhắm mục tiêu chỉ mục, giống như ví dụ đầu tiên - nếu có thể."

Không, không thể.

Cách gần nhất bạn có thể nhận được là lấy một Mảng các khóa của đối tượng và sử dụng:

var keys = Object.keys( obj );

... nhưng không có gì đảm bảo rằng các chìa khóa sẽ được trả lại theo thứ tự bạn đã xác định. Vì vậy, nó có thể trông giống như:

keys[ 0 ];  // 'evenmore'
keys[ 1 ];  // 'something'

6
Object.keys()có thể được sử dụng một cách đáng tin cậy nếu bạn biết nội dung của đối tượng. Chi tiết hơn ở đây: stackoverflow.com/questions/280713/…
cronoklee

3
Phương thức Object.keys () trả về một mảng các thuộc tính có thể liệt kê của một đối tượng nhất định, theo thứ tự giống như được cung cấp bởi vòng lặp for ... in (sự khác biệt là vòng lặp for-in liệt kê các thuộc tính trong chuỗi nguyên mẫu như tốt). developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Amr Ragaey

6
mọi thứ đều có thể
Cas Bloem

48

Cách duy nhất tôi có thể nghĩ để làm điều này là tạo một phương thức cung cấp cho bạn thuộc tính bằng cách sử dụng Object.keys();.

var obj = {
    dog: "woof",
    cat: "meow",
    key: function(n) {
        return this[Object.keys(this)[n]];
    }
};
obj.key(1); // "meow"

Demo: http://jsfiddle.net/UmkVn/

Có thể mở rộng điều này cho tất cả các đối tượng sử dụng Object.prototype;nhưng điều đó thường không được khuyến khích.

Thay vào đó, hãy sử dụng một trình trợ giúp chức năng:

var object = {
  key: function(n) {
    return this[ Object.keys(this)[n] ];
  }
};

function key(obj, idx) {
  return object.key.call(obj, idx);
}

key({ a: 6 }, 0); // 6

1
Điều này thật tuyệt và hoạt động như một sự quyến rũ! Tại sao nó không phải là câu trả lời được chấp nhận? Bạn có thể nên sử dụng return this[Object.keys(this)[n]];để làm cho nó chung chung.
cronoklee

3
Xin chào từ năm 2016, chúng tôi những người trong tương lai vẫn nghĩ rằng đây phải là câu trả lời được chấp nhận. Giải pháp tuyệt vời
mhodges 12/02/16

Lý do nó không phải là câu trả lời được chấp nhận là vì cho đến es6, thứ tự của Object.keys không được đảm bảo. Vì vậy, mặc dù mã đó hoạt động trong một số công cụ JS, nhưng nó không được đảm bảo hoạt động trong tất cả chúng. stackoverflow.com/questions/5525795/…
ptoinson

13

Bạn có thể sử dụng Object.values()phương pháp này nếu bạn không muốn sử dụng Object.keys().

Trái ngược với Object.keys()phương thức trả về một mảng các thuộc tính có thể liệt kê của một đối tượng nhất định, ví dụ:

const object1 = {
 a: 'somestring',
 b: 42,
 c: false
};

console.log(Object.keys(object1));

Sẽ in ra mảng sau:

[ 'a', 'b', 'c' ]

Các Object.values()phương thức trả về một mảng tài sản đếm được riêng một đối tượng nhất định của values.

Vì vậy, nếu bạn có cùng một đối tượng nhưng thay vào đó sử dụng các giá trị,

const object1 = {
 a: 'somestring',
 b: 42,
 c: false
};

console.log(Object.values(object1));

Bạn sẽ nhận được mảng sau:

[ 'somestring', 42, false ]

Vì vậy, nếu bạn muốn truy cập object1.b, nhưng sử dụng chỉ mục thay thế, bạn có thể sử dụng:

Object.values(object1)[1] === 42

Bạn có thể đọc thêm về phương pháp này tại đây .


1
Phương pháp này trong đề xuất trong chủ đề này có vẻ là ngắn nhất và thanh lịch nhất.
Petro Franko

5
var obj = {
    'key1':'value',
    '2':'value',
    'key 1':'value'
}

console.log(obj.key1)
console.log(obj['key1'])
console.log(obj['2'])
console.log(obj['key 1'])

// will not work
console.log(obj.2)

Biên tập:

"Tôi đặc biệt đang tìm cách nhắm mục tiêu chỉ mục, giống như ví dụ đầu tiên - nếu có thể."

Trên thực tế, 'chỉ số' là chìa khóa. Nếu bạn muốn lưu trữ vị trí của một khóa, bạn cần tạo một đối tượng tùy chỉnh để xử lý việc này.


Tôi biết rằng bạn có thể truy cập nó bằng chìa khóa, đó không phải là những gì tôi đã hỏi.
daryl 23/10/11

@Brogrammer: câu hỏi của bạn không rõ ràng, vì vậy bài đăng này có khả năng trả lời câu hỏi như đã viết.
outis

2

bằng jquery bạn có thể làm điều này:

var arr = $.map(obj,function(value, key) {
    return value;
});
alert(obj[0]);

2

Lấy dãy phím, đảo ngược nó, sau đó chạy vòng lặp của bạn

  var keys = Object.keys( obj ).reverse();
  for(var i = 0; i < keys.length; i++){
    var key = keys[i];
    var value = obj[key];
    //do stuff backwards
  }

1

bạn có thể tạo một mảng chứa đầy các trường đối tượng của mình và sử dụng một chỉ mục trên mảng và truy cập các thuộc tính đối tượng thông qua đó

propertiesName:['pr1','pr2','pr3']

this.myObject[this.propertiesName[0]]

1

Tôi đã tiếp tục và tạo một chức năng cho bạn:

 Object.prototype.getValueByIndex = function (index) {
     /*
         Object.getOwnPropertyNames() takes in a parameter of the object, 
         and returns an array of all the properties.
         In this case it would return: ["something","evenmore"].
         So, this[Object.getOwnPropertyNames(this)[index]]; is really just the same thing as:
         this[propertyName]
    */
    return this[Object.getOwnPropertyNames(this)[index]];
};

let obj = {
    'something' : 'awesome',
    'evenmore'  : 'crazy'
};

console.log(obj.getValueByIndex(0)); // Expected output: "awesome"


1
Bạn có thể giải thích những gì đang được thực hiện trong cách tiếp cận của bạn?
Rahul Bhobe

Tôi đã thêm một số nhận xét trong mã, vì vậy bạn có thể hiểu những gì đang được thực hiện.
StackGeek

0

Nếu bạn không chắc Object.keys () sẽ trả lại cho bạn các khóa theo đúng thứ tự, bạn có thể thử logic này để thay thế

var keys = []
var obj = {
    'key1' : 'value1',
    'key2' : 'value2',
    'key3' : 'value3',
}
for (var key in obj){
    keys.push(key)
}
console.log(obj[keys[1]])
console.log(obj[keys[2]])
console.log(obj[keys[3]])
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.