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

Olical
źródło
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.

Trann
źródło
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];
Josiah Ruddell
źródło
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])
}
Juan Mendes
źródło
@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 
})
Achil Aravind
źródło
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 ]
ZEE
źródło
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]);
    
}

Nikhil Vats
źródło
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

Kevin na Florydzie
źródło
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.

Połączyć
źródło
1

Od 2018 r. Możesz korzystać z Object.getOwnPropertyNames()opisanego w dokumentacji dla deweloperów Mozilli

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

console.log(Object.getOwnPropertyNames(object1));
// expected output: Array ["a", "b", "c"]
Aaqib
źródło
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].

mmurch
źródło
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);
}
ekbgh
źródło
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'));
Ashraf Abusada
źródło
-1

Szybkie i brudne:

function getObjName(obj) {
  return (wrap={obj}) && eval('for(p in obj){p}') && (wrap=null);
}
David
źródło