Iteracija per objektų savybes

29 нояб. nustatė Rafay lapkričio 29 d 2011-11-29 17:30 '11, 5:30 val. 2011-11-29 17:30
@ 27 atsakymai

Iteruojant per ypatybes reikia atlikti papildomą patikrinimą „ hasOwnProperty :

 for (var property in object) { if (object.hasOwnProperty(property)) { // do stuff } } 

Tai būtina, nes prototipo objektas turi papildomų objekto savybių, kurios techniškai yra objekto dalis. Šios papildomos savybės yra paveldimos iš bazinių objektų klasės, bet vis dar yra object savybės.

hasOwnProperty tiesiog patikrina, ar tai yra šiai klasei būdinga nuosavybė, o ne paveldėta iš bazinės klasės.

2167
24 мая '13 в 15:38 2013-05-24 15:38 atsakymą Dominik pateikė gegužės 24 d. 13 d. 15:38 2013-05-24 15:38

Pradedant nuo „JavaScript“ 1.8.5, galite naudoti „ Object.keys(obj) kad gautumėte objektų, apibrėžtų pačiame objekte, masyvą (tuos, kurie grįžta tiesa obj.hasOwnProperty(key) ).

 Object.keys(obj).forEach(function(key,index) { // key: the name of the object key // index: the ordinal position of the key within the object }); 

Tai geriau (ir geriau skaitoma) nei naudojant „for-in“ kilpą.

border=0

Šiose naršyklėse palaikoma:

  • „Firefox“ (Gecko): 4 (2.0)
  • „Chrome“: 5
  • „Internet Explorer“: 9

Daugiau informacijos rasite „ Mozilla Developer Network Object.keys“ () objekto nuorodoje .

894
13 авг. atsakymas duotas Danny R 13 rug. 2013-08-13 10:19 '13, 10:19, 2013-08-13 10:19

Tai yra for...in statement ( MDN , ECMAScript specifikacija ).

Tai galite perskaityti kaip objekto kiekvieno objekto IN funkciją, kiekvienam turtui priskiriant PROPT kintamąjį. "

193
29 нояб. Atsakymą pateikė Marc B 29 lapkričio. 2011-11-29 17:32 '11, 17:32, 2011-11-29 17:32

Merginos ir vaikinai, mes esame 2017 m., Ir neturime tiek daug laiko, kad galėtumėte įvesti ... Taigi, padarykime šį nuostabų naują išgalvotą „ECMAScript 2016“:

 Object.keys(obj).forEach(e => console.log('key=${e} value=${obj[e]}')); 
185
22 нояб. Atsakymą pateikė Frank Roth , lapkričio 22 d. 2016-11-22 11:47 '16 at 11:47 2016-11-22 11:47

Būsimose ES versijose galite naudoti „ Object.entries :

 for (const [key, value] of Object.entries(obj)) { } 

arba

 Object.entries(obj).forEach(([key, value]) => ...) 

Jei norite tik kartoti per vertybes, naudokite Object.values:

 for (const value of Object.values(obj)) { } 

arba

 Object.values(obj).forEach(value => ...) 
75
13 сент. atsakymas, kurį pateikė user663031 Sep 13 2016-09-13 09:41 '16 at 9:41 am 2016-09-13 09:41

Tai tik for...in kilpa. Peržiūrėkite „Mozilladokumentaciją .

36
29 нояб. Atsakymą pateikė Matt Ball lapkričio 29 d. 2011-11-29 17:33 '11, 17:33, 2011-11-29 17:33

„Jquery“ leidžia tai padaryti dabar:

 $.each( obj, function( key, value ) { alert( key + ": " + value ); }); 
22
29 марта '16 в 18:19 2016-03-29 18:19 atsakymą pateikė Rob Sedgwick kovo 16 d. 18:19 2016-03-29 18:19
 for (property in object) { ... } 
22
10 мая '13 в 1:58 2013-05-10 01:58 Atsakymą davė Rose Perrone , gegužės 10 d. 13 val. 1:58 2013-05-10 01:58

Dominiko atsakymas yra puikus, aš tiesiog norėčiau tai padaryti taip, kad būtų aiškiau skaitoma:

 for (var property in object) { if (!object.hasOwnProperty(property)) continue; // Do stuff... } 
17
19 янв. atsakymą pateikė Cyril N. 19 Jan. 2018-01-19 14:03 18 m. 18 val. 2018-01-19 14:03

Pirmiau pateikti atsakymai yra šiek tiek erzina, nes jie nepaaiškina, ką jūs darote kilpoje po to, kai jį pateikiate objektui: JŪS NEPRIRKITE TIESIOGIAI! Jūs iš tikrųjų pristatėte tik raktinį žodį, kurį reikia kreiptis į OBJ:

 var obj = { a: "foo", b: "bar", c: "foobar" }; // We need to iterate the string keys (not the objects) for(var someKey in obj) { // We check if this key exists in the obj if (obj.hasOwnProperty(someKey)) { // someKey is only the KEY (string)! Use it to get the obj: var myActualPropFromObj = obj[someKey]; // Since dynamic, use [] since the key isn't literally named "someKey" // NOW you can treat it like an obj var shouldBeBar = myActualPropFromObj.b; } } 

Visa tai saugi ECMA5. Netgi veikia nevykusiuose JS versijose, pvz., Rhino;)

14
28 окт. atsakymas dylanh724 28 spalis 2017-10-28 08:39 '17 at 8:39 2017-10-28 08:39

Jei jūsų aplinka palaiko ES2017, rekomenduoju Object.entries :

 Object.entries(obj).forEach(([key, value]) => { console.log('${key} ${value}'); }); 

Kaip parodyta „ Mozillas Object.entries“ () dokumentacijoje:

MetodasObject.entries“ () grąžina savo pačių skaičiuojamų [raktų, reikšmių] elementų, priklausančių tam tikram objektui, masyvą ta pačia tvarka kaip ir for ... in loop (skirtumas yra tas, kad in-in ciklų skaičius nurodo ypatybes) prototipo grandinė).

Iš esmės „Object.entries“ mes galime atsisakyti kito papildomo veiksmo, reikalingo vyresniam ...

 // This step is not necessary with Object.entries if (object.hasOwnProperty(property)) { // do stuff } 
12
08 окт. atsakymas pateiktas JSON C11 08 okt. 2017-10-08 00:27 '17 ne 0:27 2017-10-08 00:27

„For ... in loop“ reiškia kiekvieną objekto nuosavybę, nes ji atrodo kaip kilpa. Vykdydami:

  for(var propt in obj){ alert(propt + ': ' + obj[propt]); } 

Ir ... kilpa kartojasi per išvardytas objekto savybes. Nepriklausomai nuo kintamojo, kurį apibrėžiate arba įvedate į ... in loop, kiekvieną kartą, kai jis pereina į kitą nuosavybę, jis kartojasi. Kintamasis for ... į kilpą kartojasi per raktus, bet šios vertės vertė yra pagrindinė vertė. Pavyzdžiui:

  for(var propt in obj) { console.log(propt);//logs name console.log(obj[propt]);//logs "Simon" } 

Galite pamatyti, kaip kintamasis skiriasi nuo kintamojo vertės. Priešingai, a ... kilpa veikia priešingai.

Tikiuosi, kad tai padės.

11
24 янв. atsakymas pateikiamas Vappor Washmade 24 jan. 2016-01-24 06:57 '16 at 6:57 2016-01-24 06:57
 let obj = {"a": 3, "b": 2, "6": "a"} Object.keys(obj).map((item) => {console.log("item", obj[item])}) // a // 3 // 2 
10
05 мая '17 в 21:30 2017-05-05 21:30 atsakė į „ Philll_t May 05 '17, 21:30, 2017-05-05 21:30

Jei norite pridėti ES2015, naudodami Reflect.ownKeys(obj) , taip pat per iteratoriaus Reflect.ownKeys(obj) per savybes.

Pavyzdžiui:

 let obj = { a: 'Carrot', b: 'Potato', Car: { doors: 4 } }; 

galima pakartoti

 // logs each key Reflect.ownKeys(obj).forEach(key => console.log(key)); 

Jei norite iš karto keisti objektų raktų reikšmes, galite nustatyti iterator , pvz., Numatytuosius „JavaScipts“ iteratorius styginiams, matricoms, įvestoms matricoms, žemėlapiui ir rinkiniui.

JS bandys pasikartoti naudodamas numatytąjį iteratoriaus turtą, kuris turėtų būti apibrėžiamas kaip Symbol.iterator .

Jei norite sugebėti kartoti visus objektus, galite pridėti jį kaip prototipo objektą:

 Object.prototype[Symbol.iterator] = function*() { for(p of Reflect.ownKeys(this)){ yield this[p]; } } 

Tai leis jums kartoti per objekto vertes, naudodamiesi už kilpą ..., pavyzdžiui:

 for(val of obj) { console.log('Value is:' + val ) } 

Įspėjimas : nuo šio atsakymo rašymo (2018 m. Birželio mėn.) Visos kitos naršyklės, bet IE, remia generatorius ir for...of iteraciją per Symbol.iterator

10
28 июня '18 в 15:49 2018-06-28 15:49 atsakymą davė Dimitar Nikovski birželio 28 d. 18 val. 15:49 PM 2018-06-28 15:49

Galite naudoti „Lodash“. Dokumentacija

 var obj = {a: 1, b: 2, c: 3}; _.keys(obj).forEach(function (key) { ... }); 
10
04 нояб. atsakymą pateikė viktarpunko 04 lapkričio. 2016-11-04 19:51 '16 at 7:51 pm 2016-11-04 19:51

Jūsų kilpa kartojasi per visas obj objekto savybes. propt apibrėžta pirmojoje linijos eilutėje. Tai eilutė, kuri yra obj objekto nuosavybės pavadinimas. Pirmoji propt kilpos iteracija bus „vardas“.

8
29 нояб. atsakymas suteiktas arb. lapkričio 29 d 2011-11-29 17:33 '11, 17:33, 2011-11-29 17:33

Šiuo metu standartinį JS objektą galite konvertuoti į pakartotinį objektą, tiesiog pridėdami „Symbol.iterator“ metodą. Tada galite naudoti kilpą ir naudoti jos vertes tiesiogiai arba netgi naudoti sklaidos operatorių ant objekto. Atvėsinkite. Pažiūrėkime, kaip galime tai padaryti:

09 авг. atsakymas pateiktas Redu 09 rug. 2016-08-09 13:43 '16, 13:43 pm 2016-08-09 13:43

„JavaScript“ objektai yra nuosavybės rinkiniai ir todėl gali būti koduojami kiekvienam pareiškimui.

Turėtumėte galvoti apie obj kaip pagrindinių vertybių rinkinį.

8
29 нояб. Atsakymą pateikė vartotojo920041 lapkritis 29. 2011-11-29 17:34 '11, 17:34, 2011-11-29 17:34
 Object.keys(obj).forEach(key => console.log('key=${key} value=${obj[key]}') ); 
8
25 апр. Atsakymas suteiktas kolegoms Stranger 25 Bal 2018-04-25 14:02 '18, 14:02 pm 2018-04-25 14:02

Taip pat pridedamas rekursinis metodas:

 function iterate(obj) { // watch for objects we've already iterated so we won't end in endless cycle // for cases like var foo = {}; foo.bar = foo; iterate(foo); var walked = []; var stack = [{obj: obj, stack: ''}]; while(stack.length > 0) { var item = stack.pop(); var obj = item.obj; for (var property in obj) { if (obj.hasOwnProperty(property)) { if (typeof obj[property] == "object") { // check if we haven't iterated through the reference yet var alreadyFound = false; for(var i = 0; i < walked.length; i++) { if (walked[i] === obj[property]) { alreadyFound = true; break; } } // new object reference if (!alreadyFound) { walked.push(obj[property]); stack.push({obj: obj[property], stack: item.stack + '.' + property}); } } else { console.log(item.stack + '.' + property + "=" + obj[property]); } } } } } 

Naudoti:

 iterate({ foo: "foo", bar: { foo: "foo"} }); 
4
11 февр. Atsakymą pateikė Ondrej Svejdar 11 vasaris. 2016-02-11 18:09 '16 at 18:09 2016-02-11 18:09

Jūs iš esmės norite kartoti kiekvieną objektą.

Jsfiddle

 var Dictionary = { If: { you: { can: '', make: '' }, sense: '' }, of: { the: { sentence: { it: '', worked: '' } } } }; function Iterate(obj) { for (prop in obj) { if (obj.hasOwnProperty(prop)  isNaN(prop)) { console.log(prop + ': ' + obj[prop]); Iterate(obj[prop]); } } } Iterate(Dictionary); 
3
23 июня '16 в 22:53 2016-06-23 22:53 atsakymą pateikė HovyTech birželio 23 d. 16:53 2016-06-23 22:53

Jei naudojate mazgą , rekomenduoju:

 Object.keys(obj).forEach((key, index) => { console.log(key); }); 
3
11 авг. Justinas atsakė rugpjūčio 11 d 2017-08-11 07:37 '17 at 7:37 am 2017-08-11 07:37

Kas yra, jei ... kilpa yra tai, kad jis sukuria naują kintamąjį (var someVariable) ir po to kiekvieną po kito įrašo kiekvieno konkretaus objekto nuosavybę į šį naują kintamąjį (someVariable). Todėl, jei naudojate {} bloką, galite kartoti. Apsvarstykite šį pavyzdį.

 var obj = { name:'raman', hobby:'coding', planet:'earth' }; for(var someVariable in obj) { //do nothing.. } console.log(someVariable); // outputs planet 
2
29 марта '15 в 11:48 2015-03-29 11:48 atsakymą pateikė Raman Sohi kovo 15 d. 15 val. 11:48 2015-03-29 11:48

Norėčiau pridėti prie pirmiau pateiktų atsakymų, nes galite turėti skirtingus „Javascript“ ketinimus. JSON objektas ir „Javascript“ objektas yra skirtingi dalykai, ir galbūt norėsite pakartoti JSON objekto savybes, naudodami aukščiau pasiūlytus sprendimus, ir tada nustebinkite.

Tarkime, kad turite JSON objektą, pavyzdžiui:

 var example = { "prop1": "value1", "prop2": [ "value2_0", value2_1"], "prop3": { "prop3_1": "value3_1" } } 

Neteisingas būdas perkelti į jo savybes:

 function recursivelyIterateProperties(jsonObject) { for (var prop in Object.keys(example)) { console.log(prop); recursivelyIterateProperties(jsonObject[prop]); } } 

Gali būti nustebinti, kad matote konsolės registravimą 0 , 1 ir tt kartojant naudojant savybes prop1 ir prop2 ir prop3_1 . Šie objektai yra sekos, o sekos indeksai yra šio objekto savybės „Javascript“.

Geriausias būdas rekursyviai pasikartoti per JSON objekto ypatybes yra pirmiausia patikrinti, ar šis objektas yra seka, ar ne:

 function recursivelyIterateProperties(jsonObject) { for (var prop in Object.keys(example)) { console.log(prop); if (!(typeof(jsonObject[prop]) === 'string')  !(jsonObject[prop] instanceof Array)) { recursivelyIterateProperties(jsonObject[prop]); } } } 
2
28 янв. Jadiel de Armas atsakymas dėl sausio 28 d 2016-01-28 23:41 '16 at 11:41 pm 2016-01-28 23:41

Čia kartoju kiekvieną mazgų ir sukuriu prasmingus mazgų pavadinimus. Jei pastebėsite, instancijos „Oray Array“ ir „ObjectOf Object“ gana daug daro tą patį (mano paraiškoje naudoju skirtingą logiką)

 function iterate(obj,parent_node) { parent_node = parent_node || ''; for (var property in obj) { if (obj.hasOwnProperty(property)) { var node = parent_node + "/" + property; if(obj[property] instanceof Array) { //console.log('array: ' + node + ":" + obj[property]); iterate(obj[property],node) } else if(obj[property] instanceof Object){ //console.log('Object: ' + node + ":" + obj[property]); iterate(obj[property],node) } else { console.log(node + ":" + obj[property]); } } } } 

Pastaba Mane įkvėpė atsakymas Ondrei Shveyar. Tačiau šis sprendimas turi geresnių rezultatų ir yra mažiau dviprasmiškas

2
21 февр. atsakymą pateikė Faiz Mohamed Haneef 21 vasaris. 2016-02-21 19:40 '16 at 7:40 pm 2016-02-21 19:40

Norint išaiškinti priimtą atsaką, verta pažymėti, kad jei sukuriate objekto egzempliorių su var object = Object.create(null) , tada object.hasOwnProperty(property) vadins TypeError. Kad būtų saugus, turite jį pavadinti iš prototipo taip:

 for (var property in object) { if (Object.prototype.hasOwnProperty.call(object, property)) { // do stuff } } 
1
29 авг. atsakymas pateikiamas Konrad Kiss 29 rug. 2017-08-29 10:36 '17 at 10:36 am 2017-08-29 10:36

Ją galite naudoti norėdami gauti arba nustatyti objekto ar masyvo vertę su objektais. https://jsfiddle.net/narendra_globalsysinfo/yt97dbm5/

 var reset = function(data){ for( var prop in data){ if(typeof data[prop] === 'object') { data[prop] = reset(data[prop]); } else{ if(typeof data[prop] !== 'function'){ var dataType = typeof data[prop]; var returnType = null; switch(dataType){ case 'number': returnType = 0; break; case 'string': returnType = ''; break; case 'boolean': returnType = false; break; default: break; } data[prop] = returnType; } } } return data; } var obj = { p1:{ p11:1,p12:'Hi'},p2:1,p3:function(){console.log('hi')} }; obj = reset(obj); 

Jis grąžins tą patį objektą su numatytąją vertę.

Numatytasis: jei int yra 0, eilutė yra '', o loginė - false

Pastaba: objektas, turintis funkciją kaip nuosavybė, nebus atstatytas, galite atlikti pakeitimus pagal reikalavimus ir padėkoti man.

0
03 дек. Atsakymą pateikė Narendra Singh Rathore 03 dec. 2017-12-03 05:15 '17 at 5:15 am 2017-12-03 05:15

Kiti klausimai apie „ žymių arba Užduoti klausimą