Получение имени свойства объекта

179

Мне было интересно, есть ли какой-либо способ в JavaScript, чтобы пройти через объект, как это.

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

Но получите название каждого свойства, как это.

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

Я не могу найти ничего подобного в Google. Они говорят передать им имена переменных, но это не вариант того, чего я пытаюсь достичь.

Спасибо за любую помощь, которую вы можете предложить.

Olical
источник
2
Дубликат stackoverflow.com/questions/85992/…
wajiw
4
seperateдолжно бытьseparate
Хуан Мендес
13
@JuanMendes Спасибо, исправлено. Вау, этот вопрос - взрыв из прошлого. Я прошел 'l' + new Array(1000).join('o') + 'ng'путь с тех пор.
Olical
1
проверенный ответ неверен, используйте метод Object.keys ().
Кевин Флорида
Проверенный ответ и объект Object.keys () делают разные вещи, поэтому в зависимости от того, что вы хотите, любой из них может быть правильным.
Гейб Джонсон

Ответы:

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() дает вам массив имен свойств, принадлежащих входному объекту.

Trann
источник
3
Более конкретно, Object.keys (obj) возвращает массив имен свойств, то есть ключей, принадлежащих переданному в obj.
ученик не имеет имени
1
Кроме того, Object.keys () возвращает только перечисляемые свойства, Object.getOwnProperties () возвращает все свои свойства
bitfishxyz
192

i это имя.

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

Так что вы могли бы сделать:

seperateObj[i] = myObject[i];
Джосия Рудделл
источник
1
К свойствам объекта можно получить доступ через синтаксис скобок. obj.prop1 совпадает с obj ['prop1'].
Джозиа Рудделл
5
Хорошей практикой является использование HasOwnProperty при использовании for..in
Bakudan
5
@Bakudan знает, что вы имеете в виду, но лучше сказать, что вы должны использовать, hasOwnPropertyесли вы не хотите наследуемых свойств. Таким образом, вы не будете слепо следовать какому-то правилу. Может случиться так, что в некоторых случаях вы действительно хотите посмотреть на унаследованные свойства. Другой способ перебрать собственные свойства объекта - использовать Object.keys . Object.keys(obj).forEach(function(prop){ alert obj[prop]})
Хуан Мендес
@Juan Mendes Да, я имел в виду случай с унаследованными свойствами. Я вынужден (к сожалению) использовать этот подход, потому что IE8 не поддерживает Object.keys ...
Bakudan
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 То, что вы сказали, является правдой, но я не отвечаю на этот вопрос, потому что да, вы можете циклически проходить по объекту и получать имя каждого свойства. Я отвечаю на вопрос, который, возможно, не соответствует предназначению ОП, я просто хотел уточнить, что несколько свойств могут указывать на один и тот же объект.
Хуан Мендес
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 ]
ZEE
источник
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]));
}

Walla! Это определенно будет работать в последних версиях Firefox и IE11 и Chrome ...

Вот некоторая документация в MDN https://developer.mozilla.org/en-US/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;
}

Вероятно, это не лучшее решение проблемы, но полезно дать вам представление о том, как это сделать.

Приветствия.

скомбинировать
источник
0

Когда вы делаете цикл for / in, который вы устанавливаете первым, i - это имя свойства. Итак, у вас есть имя свойства i и доступ к значению с помощью myObject [i].

mmurch
источник
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);
}
ekbgh
источник
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);
}
Дэвид
источник