Lấy tên tài sản của đối tượng


179

Tôi đã tự hỏi nếu có bất kỳ cách nào trong JavaScript để lặp qua một đối tượng như vậy.

for(var i in myObject) {
    // ...
}

Nhưng có được tên của từng tài sản như thế này.

for(var i in myObject) {
    separateObj[myObject[i].name] = myObject[i];
}

Tôi dường như không thể tìm thấy bất cứ điều gì như thế trên Google. Họ nói để chuyển tên của các biến với họ nhưng đây không phải là một lựa chọn cho những gì tôi đang cố gắng đạt được.

Cảm ơn vì những giúp đỡ của bạn.



4
seperatenên làseparate
Juan Mendes

13
@JuanMendes Cảm ơn, đã sửa. Wow, câu hỏi này là một vụ nổ từ quá khứ. Tôi đã đến một 'l' + new Array(1000).join('o') + 'ng'cách kể từ đó.
Olical

1
kiểm tra câu trả lời là không chính xác, sử dụng phương thức Object.keys ().
Kevin Florida

kiểm tra câu trả lời và điều Object.keys () làm những việc khác nhau, vì vậy tùy thuộc vào những gì bạn muốn, một trong hai có thể đúng.
Gabe Johnson

Câu trả lời:


163

Sử dụng Object.keys ():

var myObject = { a: 'c', b: 'a', c: 'b' };
var keyNames = Object.keys(myObject);
console.log(keyNames); // Outputs ["a","b","c"]

Object.keys() cung cấp cho bạn một mảng các tên thuộc tính thuộc về đối tượng đầu vào.


3
Cụ thể hơn, Object.keys (obj) trả về một mảng các tên thuộc tính, tức là các khóa, thuộc về thông qua trong obj.
một người học không có tên

1
Ngoài ra, Object.keys () chỉ trả về các thuộc tính có thể đếm được, Object.getOwnProperIES () sẽ trả về tất cả các thuộc tính của nó
bitfishxyz

192

i là tên

for(var name in obj) {
    alert(name);
    var value = obj[name];
    alert(value);
}

Vì vậy, bạn có thể làm:

seperateObj[i] = myObject[i];

1
Các thuộc tính đối tượng có thể được truy cập thông qua cú pháp ngoặc. obj.prop1 giống như obj ['prop1'].
Josiah Ruddell

5
Một thực hành tốt là sử dụng HasOwnProperty khi sử dụng cho..in
Bakudan

5
@Bakudan biết ý của bạn là gì, nhưng cách tốt hơn để nói là bạn nên sử dụng hasOwnPropertynếu bạn không muốn tài sản thừa kế. Bằng cách đó, bạn không mù quáng tuân theo một số quy tắc. Nó có thể là trong một số trường hợp bạn thực sự muốn xem xét các thuộc tính được kế thừa. Một cách khác để lặp qua các thuộc tính riêng của đối tượng là sử dụng Object.keys . Object.keys(obj).forEach(function(prop){ alert obj[prop]})
Juan Mendes

@Juan Mendes Vâng, ý tôi là trường hợp có tài sản thừa kế. Đáng buồn là tôi buộc phải sử dụng phương pháp này, vì IE8 không hỗ trợ Object.keys ...
Bakudan

17

Tuyên bố miễn trừ trách nhiệm Tôi đã hiểu nhầm câu hỏi là: "Tôi có thể biết tên tài sản mà một đối tượng được đính kèm không", nhưng đã chọn để lại câu trả lời vì một số người có thể kết thúc ở đây trong khi tìm kiếm nó.


Không, một đối tượng có thể được gắn vào nhiều thuộc tính, vì vậy nó không có cách nào biết tên của nó.

var obj = {a:1};
var a = {x: obj, y: obj}

Tên của obj sẽ là gì?

Bạn có chắc chắn rằng bạn không chỉ muốn tên thuộc tính từ vòng lặp for?

for (var propName in obj) {
  console.log("Iterating through prop with name", propName, " its value is ", obj[propName])
}

@ChadSchouggins Những gì bạn nói là đúng, nhưng đó không phải là câu hỏi tôi đang trả lời, bởi vì, bạn có thể lặp qua một đối tượng lấy từng tên thuộc tính. Tôi đang trả lời một câu hỏi có thể không phải là ý định của OP, tôi chỉ muốn làm rõ rằng nhiều thuộc tính có thể trỏ đến cùng một đối tượng.
Juan Mendes

7

bạn có thể dễ dàng lặp đi lặp lại trong các đối tượng

ví dụ: nếu đối tượng là var a = {a: 'apple', b: 'ball', c: 'cat', d: 'búp bê', e: 'voi'};

Object.keys(a).forEach(key => {
   console.log(key) // returns the keys in an object
   console.log(a[key])  // returns the appropriate value 
})

6

để truy cập trực tiếp một thuộc tính đối tượng theo vị trí ... thường hữu ích cho thuộc tính [0] ... vì vậy, nó chứa thông tin về hơn nữa ... hoặc trong node.js 'allow.cache [0]' cho mô-đun bên ngoài được tải đầu tiên , Vân vân.

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

4

Khác với "Object.keys (obj)", chúng ta có vòng lặp "for ... in" rất đơn giản - vòng lặp trên vô số tên thuộc tính của một đối tượng.

const obj = {"fName":"John","lName":"Doe"};

for (const key in obj) {
    //This will give key
      console.log(key);
    //This will give value
    console.log(obj[key]);
    
}


3

Để lấy thuộc tính của đối tượng hoặc "khóa mảng" hoặc "chỉ mục mảng" tùy thuộc vào ngôn ngữ mẹ đẻ của bạn là gì ..... Sử dụng phương thức Object.keys ().

Quan trọng, điều này chỉ tương thích với "Trình duyệt hiện đại":

Vì vậy, nếu đối tượng của bạn được gọi, myObject ...

var c = 0;
for(c in myObject) {
    console.log(Object.keys(myObject[c]));
}

Walla! Điều này chắc chắn sẽ hoạt động trong firefox và eg11 và chrome mới nhất ...

Dưới đây là một số tài liệu tại MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys


2

Ở ES5

EG bạn có loại đối tượng này:

var ELEMENTS = {
    STEP_ELEMENT: { ID: "0", imageName: "el_0.png" },
    GREEN_ELEMENT: { ID: "1", imageName: "el_1.png" },
    BLUE_ELEMENT: { ID: "2", imageName: "el_2.png" },
    ORANGE_ELEMENT: { ID: "3", imageName: "el_3.png" },
    PURPLE_ELEMENT: { ID: "4", imageName: "el_4.png" },
    YELLOW_ELEMENT: { ID: "5", imageName: "el_5.png" }
};

Và bây giờ nếu bạn muốn có một hàm mà nếu bạn vượt qua '0' dưới dạng tham số - để có được 'BƯỚC_ELMENT', nếu '2' để nhận 'BLUE_ELEMENT' và cứ thế

function(elementId) {
    var element = null;

    Object.keys(ELEMENTS).forEach(function(key) {
        if(ELEMENTS[key].ID === elementId.toString()){
            element = key;
            return;
        }    
    });

    return element;
}

Đây có lẽ không phải là giải pháp tốt nhất cho vấn đề nhưng thật tốt khi cung cấp cho bạn ý tưởng làm thế nào để làm điều đó.

Chúc mừng.



0

Khi bạn thực hiện vòng lặp for / in bạn đặt lên đầu tiên, tôi là tên thuộc tính. Vì vậy, bạn có tên thuộc tính, i và truy cập giá trị bằng cách thực hiện myObject [i].


0

Những giải pháp này làm việc quá.

// Solution One
function removeProperty(obj, prop) {
  var bool;
  var keys = Object.keys(obj);
  for (var i = 0; i < keys.length; i++) {
    if (keys[i] === prop) {
      delete obj[prop];
      bool = true;
    } 
  }
  return Boolean(bool);
}


//Solution two
function removeProperty(obj, prop) {
  var bool;
  if (obj.hasOwnProperty(prop)) {
      bool = true;
      delete obj[prop];
  }
  return Boolean(bool);
}

0

Sử dụng Object.keys()chức năng để có được các thuộc tính từ một Object, và nó có thể giúp tìm kiếm thuộc tính theo tên, ví dụ:

const Products = function(){
    this.Product = "Product A";
    this.Price = 9.99;
    this.Quantity = 112;
};

// Simple find function case insensitive
let findPropByName = function(data, propertyName){
 let props = [];
 Object.keys(data).forEach(element => {
    return props.push(element.toLowerCase());
  });
  console.log(props);
  let i = props.indexOf(propertyName.toLowerCase());

  if(i > -1){
    return props[i];
  }
  return false;
};

// calling the function
let products = new Products();
console.log(findPropByName(products, 'quantity'));

-1

Nhanh & bẩn:

function getObjName(obj) {
  return (wrap={obj}) && eval('for(p in obj){p}') && (wrap=null);
}
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.