it-swarm-eu.dev

Jak mohu vyjmenovat vlastnosti objektu JavaScript?

Jak mohu vyjmenovat vlastnosti objektu JavaScript?

Vlastně chci seznam všech definovaných proměnných a jejich hodnot, ale naučil jsem se, že definování proměnné skutečně vytvoří vlastnost objektu okna.

630
davenpcj

Jednoduché:

for(var propertyName in myObject) {
   // propertyName is what you want
   // you can get the value like this: myObject[propertyName]
}

Nyní nebudete dostávat soukromé proměnné tímto způsobem, protože nejsou k dispozici.


EDIT: @ bitwiseplatypus je správné, že pokud nepoužíváte metodu hasOwnProperty(), dostanete vlastnosti, které jsou zděděné - ale nevím, proč by někdo, kdo je obeznámen s objektově orientovaným programováním, mohl očekávat něco méně! Typicky, někdo, kdo to přináší, byl podroben varováním Douglase Crockforda o tom, což mě stále trochu mátá. Znovu, dědičnost je normální část OO jazyky a je proto součástí JavaScriptu, bez ohledu na to, že je prototypický.

Nyní, to říkalo, hasOwnProperty() je užitečné pro filtrování, ale nemusíme vydávat varování, jako by existovalo něco nebezpečného při získávání zděděných vlastností.

EDIT 2: @ bitwiseplatypus vyvolá situaci, která by nastala, kdyby někdo přidal vlastnosti/metody do objektů v určitém okamžiku později, než když jste původně psali své objekty (prostřednictvím svého prototypu) pravda, že to může způsobit neočekávané chování, já osobně nevidím to jako můj problém úplně. Jen věc názoru. Kromě toho, co když navrhnu věci takovým způsobem, že budu používat prototypy při konstrukci svých objektů a přesto mám kód, který iteruje nad vlastnostmi objektu a chci všechny zděděné vlastnosti? hasOwnProperty() bych nepoužil. Pak, řekněme, někdo přidá nové vlastnosti později. Je to moje chyba, když se věci chovají špatně? Nemyslím si to. Myslím, že to je důvod, proč jQuery, jako příklad, určil způsoby rozšíření, jak funguje (přes jQuery.extend a jQuery.fn.extend).

790
Jason Bunting

Použijte smyčku for..in k výčtu vlastností objektu, ale buďte opatrní. Výčet vrátí vlastnosti nejen výčtového objektu, ale také prototypy všech nadřazených objektů.

var myObject = {foo: 'bar'};

for (var name in myObject) {
  alert(name);
}

// results in a single alert of 'foo'

Object.prototype.baz = 'quux';

for (var name in myObject) {
  alert(name);
}

// results in two alerts, one for 'foo' and one for 'baz'

Chcete-li se vyhnout zahrnutí zděděných vlastností do výčtu, zaškrtněte políčko hasOwnProperty():

for (var name in myObject) {
  if (myObject.hasOwnProperty(name)) {
    alert(name);
  }
}

Edit: Nesouhlasím s tvrzením JasonBuntinga, že se nemusíme starat o výčet zděděných vlastností. Tam je nebezpečí při výčtu zděděných vlastností, které neočekáváte, protože může změnit chování kódu.

Nezáleží na tom, zda tento problém existuje v jiných jazycích; Skutečností je, že existuje a JavaScript je obzvláště zranitelný, protože úpravy prototypu objektu ovlivňují podřízené objekty, i když k modifikaci dochází po vytvoření instance.

To je důvod, proč JavaScript poskytuje hasOwnProperty(), a to je důvod, proč byste jej měli používat, abyste zajistili, že kód třetí strany (nebo jiný kód, který by mohl modifikovat prototyp) neporušil váš. Kromě přidání několika dalších bajtů kódu není použití hasOwnProperty() nevýhodné.

215
Ryan Grove

Standardní způsob, který byl již několikrát navrhován, je:

for (var name in myObject) {
  alert(name);
}

Internet Explorer 6, 7 a 8 však mají chybu v interpretu JavaScriptu, což má za následek, že některé klávesy nejsou vyčísleny. Pokud spustíte tento kód:

var obj = { toString: 12};
for (var name in obj) {
  alert(name);
}

Pokud se ve všech prohlížečích kromě IE zobrazí upozornění „12“. IE tento klíč jednoduše ignoruje. Ovlivněné klíčové hodnoty jsou:

  • isPrototypeOf
  • hasOwnProperty
  • toLocaleString
  • toString
  • valueOf

Chcete-li být v bezpečí v IE musíte použít něco jako:

for (var key in myObject) {
  alert(key);
}

var shadowedKeys = [
  "isPrototypeOf",
  "hasOwnProperty",
  "toLocaleString",
  "toString",
  "valueOf"
];
for (var i=0, a=shadowedKeys, l=a.length; i<l; i++) {
  if map.hasOwnProperty(a[i])) {
    alert(a[i]);
  }
}

Dobrou zprávou je, že EcmaScript 5 definuje funkci Object.keys(myObject), která vrací klíče objektu jako pole a některé prohlížeče (např. Safari 4) ji již implementují.

50
Fabian Jakobs

V moderních prohlížečích (ECMAScript 5) můžete získat všechny výčetné vlastnosti, které můžete provést:

Object.keys (obj) (Chcete-li získat úryvek pro zpětnou kompatibilitu ve starších prohlížečích, zaškrtněte odkaz

Nebo můžete také získat nečíslitelné vlastnosti:

Object.getOwnPropertyNames (obj)

Zkontrolujte tabulku kompatibility ECMAScript 5

Další informace: Co je to enumerovatelný atribut?

44
Carlos Ruana

Myslím, že příklad případu, který mě překvapil, je relevantní:

var myObject = { name: "Cody", status: "Surprised" };
for (var propertyName in myObject) {
  document.writeln( propertyName + " : " + myObject[propertyName] );
}

Ale k mému překvapení je výstup

name : Cody
status : Surprised
forEach : function (obj, callback) {
    for (prop in obj) {
        if (obj.hasOwnProperty(prop) && typeof obj[prop] !== "function") {
            callback(prop);
        }
    }
}

Proč? Jiný skript na stránce rozšířil prototyp objektu:

Object.prototype.forEach = function (obj, callback) {
  for ( prop in obj ) {
    if ( obj.hasOwnProperty( prop ) && typeof obj[prop] !== "function" ) {
      callback( prop );
    }
  }
};
24
cyberhobo
for (prop in obj) {
    alert(prop + ' = ' + obj[prop]);
}
16
Andrew Hedges

Jednoduchý kód JavaScriptu:

for(var propertyName in myObject) {
   // propertyName is what you want.
   // You can get the value like this: myObject[propertyName]
}

jQuery:

jQuery.each(obj, function(key, value) {
   // key is what you want.
   // The value is in: value
});
10
EmRa228

Našel jsem to ... for (property in object) { // do stuff } zobrazí seznam všech vlastností a tedy všech globálně deklarovaných proměnných na objektu okna.

9
davenpcj

Zde je postup, jak vyjmenovat vlastnosti objektu:

var params = { name: 'myname', age: 'myage' }

for (var key in params) {
  alert(key + "=" + params[key]);
}
8
Chtiwi Malek

Pokud používáte knihovnu nderscore.js , můžete použít funkci klávesy :

_.keys({one : 1, two : 2, three : 3});
=> ["one", "two", "three"]
7
dkl

Pythonův diktát má metodu „klíče“ a to je opravdu užitečné. Myslím, že v JavaScriptu můžeme mít něco takového:

function keys(){
    var k = [];
    for(var p in this) {
        if(this.hasOwnProperty(p))
            k.Push(p);
    }
    return k;
}
Object.defineProperty(Object.prototype, "keys", { value : keys, enumerable:false });

EDIT: Ale odpověď @ carlos-ruana funguje velmi dobře. Testoval jsem Object.keys (okno) a výsledek je to, co jsem očekával.

EDIT po 5 letech: není dobré rozšířit Object, protože to může být v konfliktu s jinými knihovnami, které mohou chtít použít keys na svých objektech, a povede to k nepředvídatelnému chování vašeho projektu. @ carlos-ruana odpověď je správný způsob, jak získat klíče objektu.

5
Fabio Montefuscolo

Můžete použít for smyčky.

Pokud chcete použít pole:

Object.keys(object1)

Ref. Object.keys ()

4
Walle Cyril

Pokud se pokoušíte vyjmenovat vlastnosti, abyste mohli napsat nový kód proti objektu, doporučil bych je vizuálně použít debugger jako Firebug.

Další praktickou technikou je použití objektu Object.toJSON () Prototype pro serializaci objektu na JSON, který vám ukáže obě jména a hodnoty vlastností.

var data = {name: 'Violet', occupation: 'character', age: 25, pets: ['frog', 'rabbit']};
Object.toJSON(data);
//-> '{"name": "Violet", "occupation": "character", "age": 25, "pets": ["frog","rabbit"]}'

http://www.prototypejs.org/api/object/tojson

2
Chase Seibert

Jsem stále začátečník v JavaScriptu, ale napsal jsem malou funkci pro rekurzivní tisk všech vlastností objektu a jeho dětí:

getDescription(object, tabs) {
  var str = "{\n";
  for (var x in object) {
      str += Array(tabs + 2).join("\t") + x + ": ";
      if (typeof object[x] === 'object' && object[x]) {
        str += this.getDescription(object[x], tabs + 1);
      } else {
        str += object[x];
      }
      str += "\n";
  }
  str += Array(tabs + 1).join("\t") + "}";
  return str;
}
0
Felix Lapalme