获取对象的属性名称


178

我想知道JavaScript中是否有任何方法可以像这样遍历一个对象。

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

但是这样获取每个属性的名称。

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

我似乎在Google上找不到类似的东西。他们说与他们一起传递变量名,但这不是我要实现的目标的选择。

谢谢你尽你所能的帮助。



4
seperate应该是separate
Juan Mendes

13
@JuanMendes谢谢,改正。哇,这个问题是过去的爆炸。'l' + new Array(1000).join('o') + 'ng'从那以后我走了一条路。
Olical

1
检查的答案不正确,请使用Object.keys()方法。
佛罗里达州凯文

选中的答案和Object.keys()所做的事情有所不同,因此取决于您想要的是哪一个可能是正确的。
加贝·约翰逊

Answers:


163

使用Object.keys():

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

Object.keys() 给您一个属于输入对象的属性名称数组。


3
更具体地说,Object.keys(obj)返回属于传入的obj的属性名称(即键)的数组。
学习者没有名字

1
此外,Object.keys()仅返回可枚举的属性,Object.getOwnProperties()将返回其所有属性
bitfishxyz

191

i 是名字。

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

因此,您可以执行以下操作:

seperateObj[i] = myObject[i];

1
可以通过方括号语法访问对象属性。obj.prop1与obj ['prop1']相同。
Josiah Ruddell,2010年

5
一个好的做法是使用HasOwnProperty使用for..in时
Bakudan

5
@Bakudan知道您的意思,但是更好的表达方式是,hasOwnProperty如果您不想继承属性,则应使用。这样,您就不会盲目遵循某些规则。在某些情况下,您可能确实确实希望查看继承的属性。遍历对象自身属性的另一种方法是使用Object.keysObject.keys(obj).forEach(function(prop){ alert obj[prop]})
Juan Mendes

@Juan Mendes是的,我的意思是继承属性。我被迫(可悲地)使用这种方法,因为IE8不支持Object.keys ...
Bakudan 2014年

17

免责声明 我误解了这个问题:“我能知道对象附加的属性名称吗”,但是选择留下答案,因为有些人可能会在此处搜索。


不可以,一个对象可以附加到多个属性,因此无法知道其名称。

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

obj的名字是什么?

您确定不只是想要for循环中的属性名称吗?

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

@ChadSchouggins您所说的是正确的,但这不是我要回答的问题,因为是的,您可以遍历对象来获取每个属性名称。我正在回答一个可能不是OP想要的问题,我只是想澄清多个属性可以指向同一个对象。
Juan Mendes

7

您可以轻松地在对象中进行迭代

例如:如果对象是var a = {a:'apple',b:'ball',c:'cat',d:'doll',e:'elephant'};

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

6

用于按位置直接访问对象属性...通常对属性[0]有用...因此它保存有关进一步的信息...或在node.js'require.cache [0]'中获取第一个加载的外部模块等等等等

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

4

除了“ Object.keys(obj)”之外,我们还有一个非常简单的“ for ... in”循环-该循环遍历对象的可枚举属性名称。

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

若要获取对象的属性或“数组键”或“数组索引”,具体取决于您的母语是.....使用Object.keys()方法。

重要说明,这仅与“现代浏览器”兼容:

因此,如果您的对象被调用,myObject ...

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

瓦拉!这绝对可以在最新的firefox和ie11和chrome中工作。

这是MDN上的一些文档 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/keys


2

在ES5中

例如,您有这种对象:

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" }
};

现在,如果您要具有一个函数,可以将“ 0”作为参数传递-获取“ STEP_ELEMENT”,如果传递“ 2”获取“ BLUE_ELEMENT”,以此类推

function(elementId) {
    var element = null;

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

    return element;
}

这可能不是解决问题的最佳方法,但它可以帮助您了解如何解决。

干杯。


1

从2018年起,您可以Object.getOwnPropertyNames()按照Developer Mozilla文档中所述使用

const object1 = {
  a: 1,
  b: 2,
  c: 3
};

console.log(Object.getOwnPropertyNames(object1));
// expected output: Array ["a", "b", "c"]

0

当您进行for / in循环时,首先要设置属性名称。因此,您具有属性名称i,并通过执行myObject [i]访问该值。


0

这些解决方案也起作用。

// 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

使用Object.keys()函数从中获取属性Object,它可以帮助按名称搜索属性,例如:

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

快速又肮脏:

function getObjName(obj) {
  return (wrap={obj}) && eval('for(p in obj){p}') && (wrap=null);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.