2011-10-23 43 views
48

Nếu tôi có một mảng như thế này:Truy cập các thuộc tính đối tượng không thuộc số bằng chỉ mục?

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

tôi có thể truy cập vào các phần khác nhau bằng cách làm 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 lệnh của họ chứ không phải bằng chìa khóa?

Ví dụ:

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

Làm thế nào tôi sẽ nhận được tài sản đầu tiên cho mỗi "cái gì đó" object- từ obj và "evenmore" từ jbo -without sử dụng một cách rõ ràng tên thuộc tính?

Bây giờ, một vài trong số bạn dường như nghĩ rằng tôi là sau khi một cái gì đó như:

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

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

+2

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

+0

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

+3

Thực ra tôi muốn nói rằng có nhiều người "biết" jQuery và không biết JavaScript hơn ngược lại (ít nhất những người biết JavaScript 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 các thuộc tính objec theo chỉ mục. Họ không được yêu cầu. –

Trả lời

72

"Tôi đ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ể.

Gần nhất bạn có thể nhận được là để có được một mảng của các phím của đối tượng và sử dụng rằng:

var keys = Object.keys(obj); 

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

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

'Object.keys()' có thể được sử dụng đáng tin cậy nếu bạn biết nội dung của đối tượng. Chi tiết hơn ở đây: http://stackoverflow.com/questions/280713/elements-order-in-a-for-in-loop – cronoklee

+1

Phương thức Object.keys() trả về một mảng thuộc tính đếm được của một đối tượng đã cho, trong cùng thứ tự như được cung cấp bởi vòng lặp for ... (sự khác biệt là vòng lặp for-in cũng liệt kê các thuộc tính trong chuỗi nguyên mẫu). https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys –

2
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) 

Chỉnh sửa: "Tôi đặc biệt muốn nhắm mục tiêu chỉ số, giống như ví dụ đầu tiên - nếu nó có thể"

Thực tế 'chỉ mục' là 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ý điều này.

+0

Tôi biết rằng bạn có thể truy cập nó bằng khóa, đó không phải là những gì tôi đã yêu cầu. – daryl

+0

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

+0

ok, sau đó vui lòng giải thích thêm – cuzzea

34

Cách duy nhất tôi có thể nghĩ đến việc này là tạo phương thức cung cấp cho bạn thuộc tính 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/

Nó sẽ có thể mở rộng 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 đó, sử dụng một hàm helper:

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? Có lẽ bạn nên sử dụng 'return this [Object.keys (this) [n]];' để làm cho nó trở thành generic. – cronoklee

+1

Xin chào từ năm 2016, chúng ta trong tương lai dân gian 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

+0

Lý do nó không phải là câu trả lời được chấp nhận là bởi vì cho đến khi es6, thứ tự của Object.keys không được bảo đảm. Vì vậy, mặc dù mã đó hoạt động trong một vài công cụ JS, nhưng nó không được đảm bảo hoạt động trong tất cả các công cụ đó. https://stackoverflow.com/questions/5525795/does-javascript-guarantee-object-property-order – ptoinson

0

Nếu bạn không chắc chắn đối tượng.phím() sẽ trả lại cho bạn các phím theo thứ tự đúng, bạn có thể thử Logic thay

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]]) 
0

này 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]); 
0

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

Như trái ngược với Object.keys() phương thức trả về một mảng các thuộc tính đếm được của một đối tượng nhất định, vì vậy ví dụ:

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

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

sẽ in ra các mảng sau:

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

Phương pháp Object.values() trả về một mảng thuộc tính có thể đếm được của một đối tượng nhất định values.

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

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

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

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

[ 'somestring', 42, false ] 

Vì vậy, nếu bạn muốn truy cập vào object1.b, nhưng sử dụng một chỉ số thay vào đó 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 here.

Các vấn đề liên quan