Uzyskiwanie nazwy właściwości obiektu


179

Zastanawiałem się, czy w JavaScript jest jakikolwiek sposób na przechodzenie przez taki obiekt.

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

Ale zdobądź nazwę każdej takiej nieruchomości.

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

Nie mogę znaleźć czegoś takiego w Google. Mówią, że przekazują nazwy zmiennych razem z nimi, ale nie jest to opcja dla tego, co próbuję osiągnąć.

Dzięki za wszelką pomoc, którą możesz zaoferować.



4
seperatepowinno byćseparate
Juan Mendes

13
@JuanMendes Dzięki, poprawione. Wow, to pytanie jest wybuchem z przeszłości. Doszedłem do 'l' + new Array(1000).join('o') + 'ng'drogę od tego czasu.
Olical

1
sprawdzona odpowiedź jest niepoprawna, użyj metody Object.keys ().
Kevin Florida,

sprawdzone odpowiedzi i Object.keys () robią różne rzeczy, więc w zależności od tego, co chcesz, jedno może mieć rację.
Gabe Johnson

Odpowiedzi:


163

Użyj Object.keys ():

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

Object.keys() daje tablicę nazw właściwości należących do obiektu wejściowego.


3
Mówiąc dokładniej, Object.keys (obj) zwraca tablicę nazw właściwości, tj. Kluczy, należących do przekazanych w obj.
uczeń nie ma imienia

1
Dodanie, Object.keys () zwraca tylko właściwości możliwe do wyrażenia, Object.getOwnProperties () zwróci wszystkie swoje właściwości
bitfishxyz

191

i jest imię.

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

Więc możesz zrobić:

seperateObj[i] = myObject[i];

1
Do właściwości obiektu można uzyskać dostęp poprzez składnię nawiasu. obj.prop1 jest taki sam jak obj ['prop1'].
Josiah Ruddell,

5
Dobrą praktyką jest używanie HasOwnProperty podczas korzystania z for..in
Bakudan

5
@ Bakudan wie, co masz na myśli, ale lepszym sposobem na wyrażenie tego jest skorzystanie z niego, hasOwnPropertyjeśli nie chcesz dziedziczonych właściwości. W ten sposób nie będziesz ślepo przestrzegać jakiejś reguły. Może się zdarzyć, że w niektórych przypadkach rzeczywiście chcesz przejrzeć odziedziczone właściwości. Innym sposobem na przechodzenie między własnymi właściwościami obiektu jest użycie Object.keys . Object.keys(obj).forEach(function(prop){ alert obj[prop]})
Juan Mendes,

@Juan Mendes Tak, miałem na myśli przypadek z odziedziczonymi właściwościami. Jestem zmuszony (niestety), aby korzystać z tej metody, ponieważ IE8 nie obsługuje Object.keys ...
Bakudan

17

Oświadczenie Nie zrozumiałem pytania: „Czy mogę znać nazwę właściwości, do której obiekt został dołączony”, ale postanowiłem zostawić odpowiedź, ponieważ niektórzy ludzie mogą tu znaleźć się podczas wyszukiwania.


Nie, obiekt może być dołączony do wielu właściwości, więc nie ma możliwości poznania jego nazwy.

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

Jak miałaby na imię obj?

Czy na pewno nie chcesz tylko nazwy właściwości z pętli for?

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

@ChadSchouggins To, co powiedziałeś, jest prawdą, ale nie odpowiadam na to pytanie, ponieważ tak, możesz zapętlać obiekt, aby uzyskać nazwę każdej właściwości. Odpowiadam na pytanie, które może nie być zgodne z zamierzeniami PO, chciałem tylko wyjaśnić, że wiele właściwości może wskazywać na ten sam obiekt.
Juan Mendes,

7

możesz łatwo iterować po obiektach

np .: jeśli przedmiotem jest var a = {a: „jabłko”, b: „piłka”, c: „kot”, d: „lalka”, e: „słoń”};

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

6

do bezpośredniego dostępu do właściwości obiektu według pozycji ... ogólnie przydatne dla właściwości [0] ... więc zawiera informacje o dalszych ... lub w pliku node.js 'need.cache [0]' dla pierwszego załadowanego modułu zewnętrznego , itd itd.

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

4

Oprócz „Object.keys (obj)”, mamy bardzo prostą pętlę „for ... in” - która zapętla się nad wymiennymi nazwami właściwości obiektu.

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

Aby uzyskać właściwość obiektu lub „klucz tablicy” lub „indeks tablicy” w zależności od języka ojczystego ..... Użyj metody Object.keys ().

Ważne, jest to zgodne tylko z „nowoczesnymi przeglądarkami”:

Więc jeśli twój obiekt zostanie wywołany, myObject ...

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

Walla! To na pewno zadziała w najnowszym Firefoksie i ie11 i chrome ...

Oto dokumentacja w MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys


2

W ES5

EG, masz ten obiekt:

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

A teraz, jeśli chcesz mieć funkcję, która jeśli podasz „0” jako parametr - aby uzyskać „STEP_ELEMENT”, jeśli „2”, aby uzyskać „BLUE_ELEMENT” i tak dla

function(elementId) {
    var element = null;

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

    return element;
}

Prawdopodobnie nie jest to najlepsze rozwiązanie problemu, ale dobrze jest dać ci pomysł, jak to zrobić.

Twoje zdrowie.



0

Kiedy wykonujesz pętlę for / in, którą ustawiasz jako pierwszą, i jest nazwą właściwości. Masz więc nazwę właściwości i i uzyskujesz dostęp do wartości, wykonując myObject [i].


0

Te rozwiązania również działają.

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

Używanie Object.keys()funkcji do uzyskiwania właściwości od Objecti może pomóc w wyszukiwaniu właściwości według nazwy, na przykład:

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

Szybkie i brudne:

function getObjName(obj) {
  return (wrap={obj}) && eval('for(p in obj){p}') && (wrap=null);
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.