cách tốt nhất để lấy khóa của đối tượng javascript / giá trị


182

Nếu tôi có một đối tượng JS như:

var foo = { 'bar' : 'baz' }

Nếu tôi biết rằng foocó cấu trúc khóa / giá trị cơ bản đó, nhưng không biết tên của khóa, cách dễ nhất để có được nó là gì? for ... in? $.each()? Tôi hy vọng có một cái gì đó tốt hơn ....


5
Có chuyện gì với ... trong?
Matt

1
Nó cảm thấy gián tiếp và bạn phải sử dụng hasOwnProperty. Tôi đoán tôi sẽ tạo một chức năng thư viện để thực hiện nó ....
spugman

Câu trả lời:


92

Nếu bạn muốn nhận tất cả các khóa, ECMAScript 5 đã giới thiệuObject.keys . Điều này chỉ được hỗ trợ bởi các trình duyệt mới hơn nhưng tài liệu MDC cung cấp một triển khai thay thế (cũng sử dụng for...inbtw):

if(!Object.keys) Object.keys = function(o){
     if (o !== Object(o))
          throw new TypeError('Object.keys called on non-object');
     var ret=[],p;
     for(p in o) if(Object.prototype.hasOwnProperty.call(o,p)) ret.push(p);
     return ret;
}

Tất nhiên nếu bạn muốn cả hai, khóa và giá trị, thì đó for...inlà giải pháp hợp lý duy nhất.


pđưa cho tôi chìa khóa nhưng làm thế nào để tôi nhận được giá trị của chìa khóa? Cảm ơn.
Si8

1
Đối với cả khóa và giá trị, hãy sử dụng Object.entries () developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
trộm

có lẽ đó là một dấu hiệu cho sự hiểu biết hạn chế của tôi, nhưng câu trả lời này có vẻ dài dòng vô cùng (có thể tái sử dụng) cho một cái gì đó đơn giản như nhận được một khóa / giá trị. Không nên trả lời @Michael Bénin là câu trả lời hay nhất?
Aaron Matthews

7
Erm ... có ai khác nhấp vào liên kết đầu tiên được chuyển hướng đến ma túy ẩn danh không?
John Duskin

191

Bạn sẽ lặp lại bên trong đối tượng với một vòng lặp for:

for(var i in foo){
  alert(i); // alerts key
  alert(foo[i]); //alerts key's value
}

Hoặc là

Object.keys(foo)
  .forEach(function eachKey(key) { 
    alert(key); // alerts key 
    alert(foo[key]); // alerts value
  });

Nếu tôi không muốn foo[i]trở thành "_proto_"?
dùng2284570


Điều gì xảy ra nếu tôi không muốn cảnh báo () foo[i]nếu isome string?
dùng2284570

@ user2284570: tôi có thể là một chuỗi - không vấn đề gì.
Gerfried

không có nghĩa là bạn (var i trong Object.keys (foo)) {
jack samurai

103

Bạn có thể truy cập từng khóa riêng lẻ mà không lặp lại như trong:

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

3
Bây giờ bạn có thể sử dụng toán tử lây lan cho mục đích này, có vẻ tốt hơn: const [firstKey, ...rest] = Object.keys(obj);
Nerlin

65

Đưa ra đối tượng của bạn:

var foo = { 'bar' : 'baz' }

Để có được bar, sử dụng:

Object.keys(foo)[0]

Để có được baz, sử dụng:

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

Giả sử một đối tượng


26

Một lót cho bạn:

const OBJECT = {
    'key1': 'value1',
    'key2': 'value2',
    'key3': 'value3',
    'key4': 'value4'
};

const value = 'value2';

const key = Object.keys(OBJECT)[Object.values(OBJECT).indexOf(value)];

window.console.log(key); // = key2

25

Đây là cách đơn giản và dễ dàng nhất. Đây là cách chúng tôi làm điều này.

var obj = { 'bar' : 'baz' }
var key = Object.keys(obj)[0];
var value = obj[key];
     
 console.log("key = ", key) // bar
 console.log("value = ", value) // baz
Object.keys () là phương thức javascript trả về một mảng các khóa khi sử dụng trên các đối tượng.

Object.keys(obj) // ['bar']

Bây giờ bạn có thể lặp lại trên các đối tượng và có thể truy cập các giá trị như bên dưới-

Object.keys(obj).forEach( function(key) {
  console.log(obj[key]) // baz
})

Bạn có thể nhận được TypeErrornếu bạn mong đợi một khóa là một số. Bởi vì các phím luôn là chuỗi.
Màu xanh lá cây

15

Tôi đã có cùng một vấn đề và đây là những gì đã làm việc

//example of an Object
var person = {
    firstName:"John",
    lastName:"Doe",
    age:50,
    eyeColor:"blue"
};

//How to access a single key or value
var key = Object.keys(person)[0];
var value = person.firstName;

11
tại sao không var value = person[key];? Bằng cách đó, bạn không cần phải biết chìa khóa của giá trị bạn muốn kéo.
Sean Kendle

14
// iterate through key-value gracefully
const obj = { a: 5, b: 7, c: 9 };
for (const [key, value] of Object.entries(obj)) {
  console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
}

Giới thiệu MDN



4

Không có cách nào khác hơn for ... in. Nếu bạn không muốn sử dụng điều đó (vì nó không hiệu quả khi phải kiểm tra hasOwnPropertytrên mỗi lần lặp?) Thì hãy sử dụng một cấu trúc khác, ví dụ: một mảng của kvp:

[{ key: 'key', value: 'value'}, ...]

4

Vì bạn đã đề cập $.each(), đây là một cách tiếp cận hữu ích sẽ hoạt động trong jQuery 1.6+:

var foo = { key1: 'bar', key2: 'baz' };

// keys will be: ['key1', 'key2']
var keys = $.map(foo, function(item, key) {
  return key;
});

4

Cách dễ nhất là chỉ sử dụng Underscore.js:

chìa khóa

_.keys (object) Lấy tất cả tên của các thuộc tính của đối tượng.

_.key ({một: 1, hai: 2, ba: 3}); => ["một", "hai", "ba"]

Vâng, bạn cần một thư viện bổ sung, nhưng nó rất dễ dàng!


4
@lonesomeday có, nhưng gạch dưới / lodash hữu ích theo nhiều cách khác, vì vậy nó đáng để đưa lên.
jcollum

4

Object.keys () Phương thức Object.keys () trả về một mảng các thuộc tính liệt kê riêng của một đối tượng đã cho, theo cùng thứ tự được cung cấp bởi một vòng lặp for ... trong vòng (sự khác biệt là vòng lặp for liệt kê các thuộc tính trong chuỗi nguyên mẫu là tốt).

var arr1 = Object.keys(obj);

Object.values ​​() Phương thức Object.values ​​() trả về một mảng các giá trị thuộc tính có thể đếm được của chính một đối tượng nhất định, theo cùng thứ tự được cung cấp bởi một vòng lặp for ... trong vòng lặp (sự khác biệt là vòng lặp for-in liệt kê tính chất trong chuỗi nguyên mẫu là tốt).

var arr2 = Object.values(obj);

Để biết thêm xin vui lòng đến đây


3

sử dụng cho mỗi vòng lặp để truy cập các khóa trong Object hoặc Maps trong javascript

for(key in foo){
   console.log(key);//for key name in your case it will be bar
   console.log(foo[key]);// for key value in your case it will be baz
}

Lưu ý: bạn cũng có thể sử dụng

Object.keys (foo);

nó sẽ cung cấp cho bạn như đầu ra này:

[quán ba];


1

Vâng $.eachlà một cấu trúc thư viện, trong khi đó for ... inlà js bản địa, nên tốt hơn


1

Bạn có thể sử dụng chức năng Object.keys để nhận các khóa như:

const tempObjects={foo:"bar"}

Object.keys(tempObjects).forEach(obj=>{
   console.log("Key->"+obj+ "value->"+tempObjects[obj]);
});

0

để hiển thị dưới dạng chuỗi, chỉ cần sử dụng:

console.log("they are: " + JSON.stringify(foo));

0

cách tốt nhất để lấy khóa / giá trị của đối tượng.

let obj = {
        'key1': 'value1',
        'key2': 'value2',
        'key3': 'value3',
        'key4': 'value4'
    }
    Object.keys(obj).map(function(k){ 
    console.log("key with value: "+k +" = "+obj[k])    
    
    })
    

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.