Отримання власності імені об’єкта


179

Мені було цікаво, чи існує якийсь спосіб у JavaScript провести цикл через такий об’єкт.

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

Але отримайте найменування кожного подібного об'єкта.

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

Я не можу знайти щось подібне в Google. Вони кажуть передати назви змінних разом із ними, але це не варіант для того, що я намагаюся досягти.

Дякуємо за будь-яку допомогу, яку Ви можете запропонувати.



4
seperateмає бутиseparate
Хуан Мендес

13
@JuanMendes Спасибі, виправлено. Нічого собі, це питання - це вибух з минулого. Я з 'l' + new Array(1000).join('o') + 'ng'тих пір прийшов шляхом.
Оликал

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


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 при використанні для..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?

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: 'лялька', e: 'слон'};

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 'Requ.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 та хромованих ...

Ось деяка документація на MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys


2

В ES5

EG у вас є такий тип об'єкта:

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].


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);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.