Lấy danh sách khóa đối tượng JavaScript


295

Tôi có một đối tượng JavaScript như

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}

Làm thế nào tôi có thể nhận được độ dài và danh sách các khóa trong đối tượng này?



@TJ Tôi nghĩ nó không hoàn toàn giống nhau. Đây là một đối tượng, trùng lặp là một đối tượng JSON.
GuyT

nếu bạn có dấu gạch dưới, thì chỉ cần _.keys (your_object)
minhajul

1
Vì mọi thứ đã thay đổi kể từ năm 2010, có lẽ tốt hơn là chấp nhận câu trả lời được đánh giá cao nhất là "câu trả lời"
Jonas Wilms

Câu trả lời:


341

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
};
var keys = [];

for (var k in obj) keys.push(k);

alert("total " + keys.length + " keys: " + keys);


Tôi không cho rằng Javascript giống như PHP, nơi bạn có thể bỏ qua dòng đầu tiên hoàn toàn? Không phải là một cái gì đó như thế được khuyến khích để làm anyway.
Bart van Heukelom

@Bart: Không, dòng đầu tiên là cần thiết trong JavaScript.
Daniel Vassallo

6
Bạn nên xem bình luận của David Morrissey dưới đây cho một trường hợp cạnh ở đây. Đôi khi thực hiện phương pháp này sẽ dẫn đến các thành viên không mong muốn của nguyên mẫu hiển thị trong keys.

2
@pat: Nếu bạn đang sử dụng nghĩa đen của đối tượng, điều đó sẽ chỉ xảy ra nếu bạn gia hạn Object.prototype, điều mà bạn không nên làm. Đối với các nhà xây dựng tùy chỉnh, mặc dù, bạn đã đúng.
Sasha Chedygov

@BartvanHeukelom thậm chí trở lại vào tháng 6 năm 2010 đã gây ra một thông báo, vì điều đó có nghĩa là bạn đang ngầm gõ đối tượng. Việc gán []cho nó (hoặc array()sau đó) làm cho nó trở thành một mảng, sau đó bạn có thể sử dụng như một mảng một cách an toàn.
Niels Keurentjes

627

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}
var keys = Object.keys(obj);
console.log('obj contains ' + keys.length + ' keys: '+  keys);

được hỗ trợ trên hầu hết các trình duyệt chính hiện nay.


7
Thực tế là nó hoạt động trong Chrome cũng có nghĩa là nó hoạt động trong Node.js vì cả hai đều được xây dựng trên công cụ javascript V8.
Homme Zwaagstra

9
@fet Ngày nay, vâng. Hai năm trước, không nhiều lắm.
AlbertEngelB

4
Lưu ý rằng điều này khác với for(key in ob)! Object.keyssẽ không liệt kê các khóa từ nguyên mẫu, nhưng .. in objkhông.
Albert

9
@fet windows7 đi kèm với IE8. Tuyệt vời như vậy, không có cách nào đây có thể là câu trả lời được chấp nhận cho đến khi mọi người ngừng sử dụng IE8.
rình mò

1
Tại đây developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/, bạn tìm thấy một phương thức JavaScript hoạt động chính xác trong các trình duyệt cũ và không ghi đè chức năng trong các trình duyệt mới hơn. Cũng xem câu trả lời của tôi dưới đây.
Sandro

27

Underscore.js làm cho việc chuyển đổi khá sạch sẽ:

var keys = _.map(x, function(v, k) { return k; });

Chỉnh sửa: Tôi nhớ rằng bạn cũng có thể làm điều này:

var keys = _.keys(x);

Điều đó đúng, nguồn gạch dưới thực tế: localKeys = Object.keys; hasOwnProperty = ObjProto.hasOwnProperty; .has = function (obj, key) {return hasOwnProperty.call (obj, key); }; _.keys = phím gốc | | function (obj) {if (obj! == Object (obj)) ném TypeError mới ('Đối tượng không hợp lệ'); phím var = []; for (var key in obj) if ( .has (obj, key)) Keys.push (key); chìa khóa trả lại; };
Miguel Alejandro Fuentes Lopez

18

Nếu bạn chỉ muốn các khóa dành riêng cho đối tượng cụ thể đó chứ không phải bất kỳ prototypethuộc tính dẫn xuất nào :

function getKeys(obj) {
    var r = []
    for (var k in obj) {
        if (!obj.hasOwnProperty(k)) 
            continue
        r.push(k)
    }
    return r
}

ví dụ:

var keys = getKeys({'eggs': null, 'spam': true})
var length = keys.length // access the `length` property as usual for arrays

4
var keys = new Array();
for(var key in obj)
{
   keys[keys.length] = key;
}

var keyLength = keys.length;

để truy cập bất kỳ giá trị nào từ đối tượng, bạn có thể sử dụng obj [key];


bạn cần tăng chỉ số mảng
Vivek

chỉ số mảng được tăng tự động theo keys.length, khác nhau cho mỗi lần lặp khi mỗi lần lặp chèn một giá trị.
KrekkieD

4
obj = {'a':'c','b':'d'}

Bạn co thể thử:

[index for (index in obj)] 

cái này sẽ trở lại:

['a','b']

để lấy danh sách các khóa hoặc

[obj[index] for (index in obj)]

để có được các giá trị


Không hoạt động trong Google Chrome v16.0.912.75, nhưng nó hoạt động trong Firefox v10.0
RobM

4

Anurags trả lời về cơ bản là chính xác. Nhưng để hỗ trợ Object.keys(obj)trong các trình duyệt cũ hơn, bạn có thể sử dụng mã bên dưới được sao chép từ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys . Nó thêm Object.keys(obj)phương thức nếu nó không có sẵn từ trình duyệt.

if (!Object.keys) {
 Object.keys = (function() {
 'use strict';
 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 = [], prop, i;

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

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

3

Lưu ý rằng trong coffeescript, điều này có thể được thực hiện trong tất cả các trình duyệt và nút như

k for k of obj

và như vậy

(1 for _ of obj).length

3

Giải pháp đệ quy cho các trình duyệt hỗ trợ ECMAScript 5:

var getObjectKeys = function(obj) {
    var keys = Object.keys(obj);
    var length = keys.length;

    if (length !== 0) {
        for (var i = 0; i < length; i++) {
            if (typeof obj[keys[i]] === 'object') {
                keys[keys[i]] = getObjectKeys(obj[keys[i]]);
            }
        }
    }

    return keys;
};

3
var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}

console.log(Object.keys(obj));
console.log(Object.keys(obj).length)


3

Nếu bạn quyết định sử dụng Underscore.js, bạn nên làm

var obj = {
    key1: 'value1',
    key2: 'value2',
    key3: 'value3',
    key4: 'value4'
}

var keys = [];
_.each( obj, function( val, key ) {
    keys.push(key);
});
console.log(keys.lenth, keys);

3

Trong JavaScript, một đối tượng là một thực thể độc lập, với các thuộc tính và loại.

Để tìm nạp các giá trị từ Object dưới dạng mảng: Object .values ​​(obj) // obj là tên đối tượng mà bạn đã sử dụng Kết quả -> ["value1", "value2", "value3", "value4"]

Để tìm nạp các khóa từ Object dưới dạng mảng: Object .keys (obj) // obj là tên đối tượng mà bạn đã sử dụng Kết quả -> ["key1", "key2", "key3", "key4"]

Vì cả hai hàm đều trả về mảng, bạn có thể nhận được độ dài của khóa hoặc giá trị bằng cách sử dụng thuộc tính length. Ví dụ: Object .values ​​(obj) .length hoặc Object .keys (obj) .length


2

Để biết một chuỗi được phân tách bằng dấu phẩy liệt kê các khóa của Đối tượng JSON, hãy thử các cách sau:

function listKeys(jObj){
    var keyString = '';
    for(var k in jObj){
        keyString+=(','+k);
    }
    return keyString.slice(1);
}



/* listKeys({'a' : 'foo', 'b' : 'foo', 'c' : 'foo'}) -> 'a,b,c' */

2

Sử dụng ES6, bạn có thể sử dụng forEachđể lặp lại các Khóa của Đối tượng. Để nhận tất cả các khóa bạn có thể sử dụng Object.keys, trả về tất cả các khóa trong Đối tượng

Object.keys(obj).forEach(function(keyValue, index, map) { 
  console.log(keyValue); 
});

Bàn tay ngắn của đoạn trích trên sẽ là, chỉ mất một tham số

Object.keys(obj).forEach(function(keyValue) { 
  console.log(keyValue); 
});

1
       if(props.userType){
          var data = []
          Object.keys(props.userType).map(i=>{
                data.push(props.userType[i])
          })
          setService(data)
        }

0

sử dụng lát, áp dụng và tham gia phương pháp.

var print = Array.prototype.slice.apply( obj );
alert('length='+print.length+' list'+print.join());
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.