වස්තු ගුණාංග හරහා අනුකරණය කරන්න


2053

var obj = {
    name: "Simon",
    age: "20",
    clothing: {
        style: "simple",
        hipster: false
    }
}

for(var propt in obj){
    console.log(propt + ': ' + obj[propt]);
}

විචල්‍යය proptවස්තුවේ ගුණාංග නිරූපණය කරන්නේ කෙසේද ? එය ගොඩනංවන ක්‍රමයක් හෝ දේපලක් නොවේ. වස්තුවේ ඇති සෑම දේපලක් සමඟම එය පැමිණෙන්නේ ඇයි?


12
if (typeof(obj[propt]) === 'object') {/ * නැවත එය කරන්න * /}
noob

13
හොඳයි, මෙම ප්‍රශ්නයට ඇත්තෙන්ම කණගාටුයි. ලූපයක් යනු කුමක්දැයි මම දනිමි, "වස්තු ගුණාංග හරහා ලූප කිරීම" වටා මගේ හිස ලබා ගත නොහැකි විය, එය දැන් නිෂ්කාශනය වී ඇතැයි මම සිතමි. එසේම, ඔවුන් මට නිර්දේශ කර ඇත්තේ "ජාවාස්ක්‍රිප්ට් පියවරෙන් පියවර 2 වන සංස්කරණය - පාසලේදී ස්ටීව් සූහ්රිං
රෆේ

243
මෙය කදිම හිඟන්නන්ගේ ප්‍රශ්නයකි. වෙනත් භාෂා සමඟ මට අවුරුදු 15 ක වෘත්තීය පළපුරුද්දක් ඇති බවත්, මට මෙම පිළිතුර අවශ්‍ය බවත් මම එකතු කරමි. මට හැකි නම් 2000 ප්ලස් කරන්න.
නේතන් සී. ට්‍රෙෂ්

61
පිස්සු, නමුත් මෙය කරන්නේ කෙසේද යන්න පිළිබඳ වාක්‍ය ඛණ්ඩය නිකුත් කිරීම සඳහා මම සෑම මාස කිහිපයකට වරක් මෙම පිටුවට පැමිණ සිටිමි. මෙය කරන්නේ කෙසේදැයි මතක තබා ගැනීමට මට කරදරයක් නැත ... මට මතකයි මෙම පිටුව සැමවිටම මෙහි SO හි ඇති බව.
HDave

14
StackOverflow හි මා දුටු අමුතුම පිටුව මෙයයි. ඔබ ප්‍රශ්නය පරෙස්සමින් කියවන්නේ නම්, ඇත්ත වශයෙන්ම අසන දෙයට පිළිතුරු දීමට උත්සාහ කිරීමට පටන් ගන්නේ එක් පිළිතුරක් පමණක් වන අතර එයට ලකුණු -6 ක් ඇත. වැඩිම ලකුණු ලබා ගත් පිළිතුර, පිළිගත්, පිළිතුරු නොදක්වනවා පමණක් නොව, වැරදිය.

Answers:


2433

දේපල ඉක්මවා යෑමට මෙම අමතර hasOwnPropertyපරීක්‍ෂාව අවශ්‍ය වේ :

for (var prop in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, prop)) {
        // do stuff
    }
}

එය අවශ්‍ය වන්නේ වස්තුවක මූලාකෘතිය වස්තුව සඳහා තාක්‍ෂණිකව කොටසක් වන වස්තුව සඳහා අමතර ගුණාංග අඩංගු වන බැවිනි. මෙම අතිරේක ගුණාංග මූලික වස්තු පන්තියෙන් උරුම වී ඇති නමුත් ඒවා තවමත් ගුණාංග වේ obj.

hasOwnProperty මෙය මෙම පංතියට විශේෂිත වූ දේපලක් දැයි බැලීමට පරික්ෂා කරයි, මූලික පන්තියෙන් උරුම වූ එකක් නොවේ.


hasOwnPropertyවස්තුව හරහාම ඇමතිය හැකි ය:

if (obj.hasOwnProperty(prop)) {
    // do stuff
}

වස්තුවට එකම නමක් හා සම්බන්ධ නොවන ක්ෂේත්‍රයක් තිබේ නම් මෙය අසාර්ථක වේ:

var obj = { foo: 42, hasOwnProperty: 'lol' };
obj.hasOwnProperty('foo');  // TypeError: hasOwnProperty is not a function

Object.prototypeවෙනුවට එය ඇමතීම ආරක්ෂිත වන්නේ එබැවිනි :

var obj = { foo: 42, hasOwnProperty: 'lol' };
Object.prototype.hasOwnProperty.call(obj, 'foo');  // true

21
@BT මොසිල්ලා ප්‍රලේඛනයට අනුව : "ඔබට අවශ්‍ය වන්නේ වස්තුවට සම්බන්ධ දේපල මිස එහි මූලාකෘති නොවේ නම්, getOwnPropertyNames භාවිතා කරන්න හෝ hasOwnProperty check එකක් කරන්න (propertyIsEnumerable ද භාවිතා කළ හැකිය)."
davidmdem

3
ඇමතීමේ තේරුම object.hasOwnProperty()කුමක්ද? propertyකිසියම් වටිනාකමක් ඇති කාරණය එයින් අදහස් කරන්නේ objectනැද්ද?
ඇලෙක්ස් එස්

6
මන්ද, ඇලෙක්ස් එස්, වස්තුවක මූලාකෘතියේ වස්තුව සඳහා තාක්‍ෂණිකව කොටසක් වන වස්තුව සඳහා අමතර ගුණාංග අඩංගු වේ. ඒවා මූලික වස්තු පන්තියෙන් උරුම වූ නමුත් ඒවා තවමත් ගුණාංග වේ. hasOwnProperty සරලවම පරික්ෂා කරන්නේ මෙය මෙම පන්තියට විශේෂිත වූ දේපලක්ද යන්න සහ මූලික පන්තියෙන් උරුම වූ එකක් නොවේද යන්නයි. හොඳ පැහැදිලි කිරීමක්: brianflove.com/2013/09/05/javascripts-hasownproperty-method
කයිල් රිච්ටර්

87
කෙසේ වෙතත්, Object.keys (obj) දැන් වස්තුවේ යතුරු ලබා ගැනීම සඳහා වඩා හොඳ විසඳුමක් බව සඳහන් කළ යුතු යැයි මට හැඟේ. මොසිල්ලා ප්‍රලේඛනයට සබැඳිය: developper.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
කයිල් රිච්ටර්

9
එක් වැදගත් තොරතුරක් අතුරුදහන්. propertyමෙහි නූලක් නම්, කැඳවිය යුතුව තිබුණි propertyName. එසේ නොමැතිනම් මා වැනි ජේඑස් නවක වදය සඳහා ව්‍යාකූලත්වයක් ඇති කළ හැකිය, එනම් ඇතුළත කුමක් කළ යුතුද යන්න if.
නියොලිස්ක්

1145

ජාවාස්ක්‍රිප්ට් 1.8.5 වන විට ඔබට Object.keys(obj)වස්තුව මත අර්ථ දක්වා ඇති ගුණාංග සමූහයක් ලබා ගැනීමට භාවිතා කළ හැකිය (ඒවා සඳහා සත්‍ය වන ඒවා 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 
});

For-in loop එකක් භාවිතා කරනවාට වඩා මෙය හොඳය (සහ කියවිය හැකි).

මෙම බ්‍රව්සර් සඳහා එය සහාය දක්වයි:

  • ෆයර්ෆොක්ස් (හූනා): 4 (2.0)
  • Chrome: 5
  • ඉන්ටර්නෙට් එක්ස්ප්ලෝරර්: 9

වැඩි විස්තර සඳහා මොසිල්ලා සංවර්ධක ජාල Object.keys () හි යොමුව බලන්න.


7
මෙය දැන් වඩා පුළුල් ලෙස සහාය: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
දොම් Vinyard

3
ඔබට පැරණි බ්‍රව්සර් සඳහා සහය අවශ්‍ය නම්, ඔබට මෙම පොලිෆිල්
කයිල්මිට්

27
මෙම භාෂා ගොඩනැගීමට සහාය වන පරිසරයන් තුළ, මෙම ක්‍රමය මඟින් Array.foreach ලෙස හැඳින්වීමට ඉඩ දෙයි: Object.keys(myObject).forEach(function(key,index) { //key = the name of the object key //index = the ordinal position of the key within the object });
ටොඩ් මිල

4
@ AJ_83 සෑම () සඳහාම හොඳ ක්‍රමයක් නොමැත. මෙම අවස්ථාවේ දී () කිහිපයක් භාවිතා කර බිඳ දැමීමට සත්‍ය ලෙස ආපසු යන්න
ඩැනියෙල් ඉසෙඩ්

11
මෙය කියවීමට වඩා කියවිය හැක්කේ ඇයි? for candidate in candidateStatus... මට කියවිය හැකි බව පෙනේ
ජෝනා

313

ගැහැණු ළමයින් සහ පිරිමි ළමයින් අපි 2019 දී සිටින අතර අපට ටයිප් කිරීමට එතරම් කාලයක් නොමැත ... එබැවින් මෙම සිසිල් නව විසිතුරු ECMAScript 2016 කිරීමට ඉඩ දෙන්න:

Object.keys(obj).forEach(e => console.log(`key=${e}  value=${obj[e]}`));

17
මෙය ඩැනී ආර්ගේ පිළිතුරට වඩා වෙනස් වන්නේ කෙසේද?
ක්‍රිල්ගර්

27
එය ඔන්ලයින් යන්ත්‍රයක් වන අතර සෑම එකක් සඳහාම සිතියම භාවිතා කරයි. සමහර අයට console.log satement සමහර විට සිත්ගන්නා සුළුය.
ෆ්‍රෑන්ක් රෝත්

කනගාටුදායක ලෙස, එය ක්‍රියාත්මක වන්නේ කවදාද obj=window.performance.memory: - / කොහෙද for inකරන්නේ. එනම්var obj = window.performance.memory; for( key in obj ) console.log( 'key=' + key + ' val=' + obj[key] );
Michaelangel007

2
window.performance.memoryසහාය දක්වන්නේ ක්‍රෝම් මගින් පමණක් වන Object.keys(obj)අතර හිස් අරාවක් ලබා දෙයි. මෙයට කිසිදු සම්බන්ධයක් නැත .map.
ෆ්‍රෑන්ක් රෝත්

වරකට එකකට වඩා වැඩියෙන් කිරීමට මෙම තනි ලයිනර් නැවත සැකසීමට කිසිවෙකු වඳුරන්ට අකමැති නම් e, මම මෙම සාරාංශය පළ කර ඇත්තෙමි. එය මූලික වශයෙන් බොහෝ හෑෂ් ක්‍රියාත්මක කිරීම් හා ( (key) => (value) )ඒ වෙනුවට භාවිතා කරයි { key => value }, නමුත් ඔබට මීට පෙර එය සමඟ ගනුදෙනු කිරීමට සිදු නොවූයේ නම්, එය වඩා හොඳින් දෘශ්‍යමාන කිරීමට එය ඔබට උපකාරී වනු ඇත: gist.github.com/the-nose-knows/9f06e745a56ff20519707433e28a4fa8
kayleeFrye_onDeck

217

එය for...in statement( MDN , ECMAScript පිරිවිතර ) ය.

ඔබ "ලෙස කියවිය නොහැකි සඳහා සෑම දේපල IN එම objවස්තුව, එම එක් එක් දේපළ පැවරීමට PROPT අනෙක් අතට විචල්ය".


1
ගොඩක් ස්තූතියි, මට දැන් ඒක තේරෙනවා. මම පොත් සහ ගූගල් හරහා මගේ හිස ගසාගෙන සිටියෙමි.
රෆේ

21
@RightSaidFred සමග එකඟ වන inසමාගම සහ forප්රකාශයක් සියලු දී සම්බන්ධ නොවන බව එම for-inප්රකාශය තමන්ගේ ම ව්යාකරණ නිෂ්පාදනය නියෝජනය: for ( LeftHandSideExpression in Expression ),for ( var VariableDeclarationNoIn in Expression )
CMS

2
නියමාකාරයෙන් මෙම පිළිතුරට ඉහළ ඡන්ද ප්‍රමාණයක් ඇත, විශේෂයෙන් මෙම ජනප්‍රිය අදහස් එයට පටහැනි බව පෙනේ.
ඩග් මොලිනියුක්ස්

9
මෙය පිළිතුර ලෙස සලකුණු කරන්නේ ඇයි? මෙම ත්‍රෙඩ් එකේ ඇති අවම
උපකාරය

3
අවම ප්‍රයෝජනවත් පිළිතුර? OP ඉල්ලා සිටියේ ඔබ සිතන දේ මත ය; මා පළමු වරට ප්‍රශ්නය කියවන විට, වස්තුවක ගුණාංග පරීක්ෂා කිරීම සඳහා විචල්‍යයක් භාවිතා කළ හැකි යාන්ත්‍රණය පිළිබඳ අවුල් සහගත බවක් පෙනෙන්නට තිබුණි, සහ මෙම පිළිතුර විචක්ෂණශීලීව පැහැදිලි කරයි ('සඳහා-වැරදි' නොතකා). "එය සෑම දේපලක් සමඟම පැමිණෙන්නේ ඇයි" යන ප්‍රශ්නයෙන් ඇඟවෙන්නේ OP සතුව OOwnProperty සොයමින් සිටින නමුත් එය නොදන්නා නමුත් මම සිතන්නේ OP ට දැන ගැනීමට අවශ්‍ය වූයේ මෙය විය හැකි අතර නිවැරදිව වැරදියට පිළිගෙන ඇති බවයි. වෙනත් ප්‍රශ්නයකට පිළිතුරු දෙන්න. :-)
Bumpy

163

ඊඑස් යාවත්කාලීනව ක්‍රියාත්මක කිරීමේදී, ඔබට මෙය භාවිතා කළ හැකිය Object.entries:

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

හෝ

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

ඔබට අගයන් ඉක්මවා නැවත කියවීමට අවශ්‍ය නම්, Object.values ​​භාවිතා කරන්න:

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

හෝ

Object.values(obj).forEach(value => ...)

මෙය හොඳම විසඳුම වනු ඇත (object.entries ...), නමුත් මට එය භාවිතා කළ නොහැක. : ඔබ මෙම වාර කිහිපයක් කරන්න ඕන ඔබේ රාමුව එය කළ නොහැකි වූ විට, ඔබ විසින් මෙම පිටුව මත polyfill භාවිතා කළ හැකිය developer.mozilla.org/nl/docs/Web/JavaScript/Reference/...
මාරියෝ

ඔබ දේපලවල අගයන් පමණක් නම් තුන්වන යෝජනාව විශිෂ්ටයි. නියමයි!
ගින්ස්බර්ග්


27

ඔබේ පරිසරය ES2017 සඳහා සහය දක්වන්නේ නම් මම නිර්දේශ කරන්නේ Object.entries :

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

මොසිලස් Object.entries () ප්‍රලේඛනයේ පෙන්වා ඇති පරිදි :

මෙම Object.entries () ක්රමය සඳහා ... කේන්දුයේ (වෙනස වීම සඳහා-දී පුඩුවක් මඟින් කියවෙනුයේ අන්තර්ගතව ඇති සපයන බව මෙන් ම සඳහා, දී ඇති වස්තුව ම ගණ්ය දේපල රැසක් [යතුර, අගය] යුගල නැවත මූලාකෘති දාමයේ ගුණාංග ද).

මූලික වශයෙන් Object.entries සමඟ අපට පැරණි ... ලූප් සඳහා අවශ්‍ය වන පහත සඳහන් අමතර පියවර අත්හැර දැමිය හැකිය :

// This step is not necessary with Object.entries
if (object.hasOwnProperty(property)) {
  // do stuff
}

22

jquery ඔබට දැන් මෙය කිරීමට ඉඩ දෙයි:

$.each( obj, function( key, value ) {
  alert( key + ": " + value );
});

1
$.each({foo:1, length:0, bar:2}, function(k,v){console.log(k,v)})$ .එම වස්තු සඳහා සුදුසු නොවේ . යම් වස්තුවකට දිග දේපලක් තිබේ නම් සහ එහි වටිනාකම ශුන්‍ය වේ නම්, මුළු වස්තුවම සලකනු ලබන්නේ එය හිස් අරාවක් ලෙස ය.
බොබ් ස්ටයින්

මෙය දෝෂ ආරාධනා කරන ප්‍රවේශයක් යැයි මා සිතන්නේ ඇයිද යන්න විස්තර .
බොබ් ස්ටයින්

21

ඩොමිනික්ගේ පිළිතුර පරිපූර්ණයි, කියවීමට වඩා පිරිසිදු බැවින් මම එය එසේ කිරීමට කැමැත්තෙමි:

for (var property in object) {
    if (!object.hasOwnProperty(property)) continue;

    // Do stuff...
}

Objectනමුත් ලොකු අකුරක් තිබිය යුතුද ?
ජොනතන්

18

ඉහත පිළිතුරු ටිකක් කරදරකාරී වන්නේ ඔබ එය වස්තුවක් බව සහතික කිරීමෙන් පසුව ඔබ ලූපය තුළ කරන්නේ කුමක්ද යන්න පැහැදිලි නොකරන බැවිනි: ඔබ එය සෘජුවම ලබා නොගනී! ඔබ සැබවින්ම ලබා දෙන්නේ ඔබ OBJ වෙත අයදුම් කළ යුතු KEY පමණි:

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

මේ සියල්ල ECMA5 ආරක්ෂිතයි. රයිනෝ වැනි කොර වූ ජේඑස් අනුවාදවල පවා ක්‍රියා කරයි;)


16
if(Object.keys(obj).length) {
    Object.keys(obj).forEach(key => {
        console.log("\n" + key + ": " + obj[key]);
    });
}

// *** Explanation line by line ***

// Explaining the bellow line
// It checks if obj has at least one property. Here is how:
// Object.keys(obj) will return an array with all keys in obj
// If there is no keys in obj, it will return empty array = []
// Then it will get its length. At this point, it checks: 
// If it has at least one element, it means it's bigger than 0 
// which evaluates to true and the bellow code will be executed.
// Else means it's length = 0 which evaluates to false
// NOTE: you can use Object.hasOwnProperty() instead of Object.keys(obj).length
if(Object.keys(obj).length) {

    // Explaining the bellow line
    // Just like in the previous line, this returns an array with
    // all keys in obj (because if code execution got here, it means 
    // obj has keys.) 
    // Then just invoke built-in javascript forEach() to loop
    // over each key in returned array and calls a call back function 
    // on each array element (key), using ES6 arrow function (=>)
    // Or you can just use a normal function ((key) { blah blah }).
    Object.keys(obj).forEach(key => {

        // The bellow line prints out all keys with their 
        // respective value in obj.
        // key comes from the returned array in Object.keys(obj)
        // obj[key] returns the value of key in obj
        console.log("\n" + key + ": " + obj[key]);
    });
}

3
හායි, ඔබට ඔබේ පිළිතුර ගැන වැඩි විස්තර එකතු කළ හැකිද, කේත පමණක් සැපයීම ප්‍රයෝජනවත් නොවේ.
නිකොලස්

හායි ic නිකොලාස් මම කේතයට පේළි පැහැදිලි කිරීමක් මඟින් පේළියක් එක් කළෙමි. එය තවමත් පැහැදිලි නැතිනම් මට දන්වන්න
Fouad Boukredine

2
forEach හිස් අගයන් මඟ හැරෙන නිසා , මම හිතන්නේ ඔබට Object.keys(obj).forEach(e => console.log(`key=${e} value=${obj[e]}`));ෆ්‍රෑන්ක් රෝත්ගේ පිළිතුර මෙන් ඉවත් කර ගත හැකිය .
අඳුරු නිෂ්පාදන

15

ES2015 හි භාවිතය එක් කිරීමට Reflect.ownKeys(obj) සහ හරහා ගුණාංග නැවත නැවත යෙදීම.

උදාහරණයක් වශයෙන්:

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

නැවත නැවත කළ හැක

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

වස්තුවක යතුරු වල අගයන් හරහා කෙලින්ම පුනරාවර්තනය කිරීමට ඔබ කැමති නම්, ඔබට අර්ථ දැක්විය හැකිය iterator නූල්, අරා, ටයිප් කළ අරා, සිතියම සහ කට්ටලය සඳහා ජාවාස්කිප්ට්ස් හි පෙරනිමි අනුකාරක මෙන් .

JS විසින් පෙරනිමි iterator දේපල හරහා නැවත යෙදීමට උත්සාහ කරනු ඇත, එය අර්ථ දැක්විය යුතුය Symbol.iterator.

ඔබට සියලු වස්තූන් නැවත කියවීමට අවශ්‍ය නම් ඔබට එය වස්තුවක මූලාකෘතියක් ලෙස එකතු කළ හැකිය:

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

මෙය ඔබට ... සඳහා ... ලූපයක් සහිත වස්තුවක අගයන් නැවත සැකසීමට ඉඩ සලසයි, උදාහරණයක් ලෙස:

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

අවවාදයයි : මෙම පිළිතුර ලිවීමේදී (2018 ජූනි) අනෙක් සියලුම බ්‍රව්සර්, නමුත් අයිඊ, ආධාරක ජනක යන්ත්‍ර සහ නැවත for...ofක්‍රියාත්මක කිරීමSymbol.iterator


ඔබ ඇත්ත වශයෙන්ම OP හි ප්‍රශ්නයට පිළිතුරු නොදුන්නද, මෙය මට බෙහෙවින් උපකාරී විය, මම තවමත් පරාවර්තනය ගැන දැන සිටියේ නැත.
මිචියෙල්

12

For ... in loop මඟින් වස්තුවක එක් එක් දේපල නිරූපණය කරන්නේ එය for for loop හා සමාන වන බැවිනි. ඔබ විසින් ... සඳහා පුඩුවක් අර්ථ දැක්වුවේ:

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

A for ... loop එකකින් වස්තුවක ගණන් කළ නොහැකි ගුණාංග හරහා නැවත ගමන් කරයි. ඔබ කුමන විචල්‍යය නිර්වචනය කළත්, හෝ ... ... ලූපයෙහි තැබූ විට, එය ඊළඟ දේපල වෙත යන සෑම අවස්ථාවකම එය වෙනස් වේ. For ... in loop හි විචල්‍යය යතුරු හරහා පුනරාවර්තනය වේ, නමුත් එහි වටිනාකම යතුරේ අගය වේ. උදාහරණයක් වශයෙන්:

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

විචල්‍යය විචල්‍යයේ අගයට වඩා වෙනස් වන්නේ කෙසේදැයි ඔබට දැක ගත හැකිය. ඊට වෙනස්ව, for ... for loop ප්‍රතිවිරුද්ධ දේ කරයි.

මම හිතනවා මේක උදව් වෙයි කියලා.



11
let obj = {"a": 3, "b": 2, "6": "a"}

Object.keys(obj).map((item) => {console.log("item", obj[item])})

// a
// 3
// 2

1
වෙනත් අදහස් දැක්වීම්වල සඳහන් කර ඇති පරිදි, forEachමෙහි වඩාත් යෝග්‍ය වන්නේ, mapඑක් එක් පුනරාවර්තනයේ කේත වාරණය ඇමතීමේ ප්‍රති with ල සමඟ නව අරාවක් නැවත ලබා දීමට අදහස් කරන බැවිනි. නමුත් අප උනන්දු වන්නේ එක් එක් පුනරාවර්තනයේ අතුරු ආබාධ කෙරෙහි මිස ප්‍රතිලාභ අගය නොවේ, එබැවින් අපට mapලබා දෙන නව අරාව අපට අවශ්‍ය නොවේ .
ඩැනී

10

ඔබට ලොඩාෂ් භාවිතා කළ හැකිය. ප්‍රලේඛනය

var obj = {a: 1, b: 2, c: 3};
_.keys(obj).forEach(function (key) {
    ...
});

10
මිහිපිට මෙම "පිළිතුරට" උඩුකුරු 10 ක් ඇත්තේ ඇයි? එය ප්‍රශ්නයට පිළිතුරු දීමට සම්පූර්ණයෙන්ම අසමත් වේ. සාමාන්‍ය JS සංවර්ධකයා පිළිබඳ බුද්ධිය කෙරෙහි මට ඇති විශ්වාසය නැති වීමට පටන් ගෙන තිබේ.
developerbmw

1
vedeveloperbmw ES6 විශේෂාංග භාවිතා කිරීම වඩාත් නිවැරදි ක්‍රමයක් බව මට වැටහී ඇත, නමුත් මම මීට වසරකට පෙර පිළිතුරු දුනිමි. කරුණාකර, ඔබට විනාඩියක් ඇති විට ඔබේ අදහස් අප සමඟ බෙදා ගන්න.
වික්ටර්පුන්කෝ

1
පේළි 10000 ක පුස්තකාලයක් ඔවුන්ගේ පිටුවට එක් කිරීමට පරිශීලකයාට යෝජනා කරනවා වෙනුවට දේශීය ක්‍රම කෙරෙහි වැඩි අවධානයක් යොමු කිරීම මෙහි අදහසයි. මාව වැරදියට තේරුම් ගන්න එපා, මම ලොඩාෂ් භාවිතා කිරීමට කැමතියි නමුත් ඒ සඳහා කාලයක් හා ස්ථානයක් ඇති අතර එය එසේ නොවේ.

9

ඔබේ forලූපය වස්තුවේ සියලුම ගුණාංග ඉක්මවා යයි obj. proptඔබේ ලූපයේ පළමු පේළියේ අර්ථ දක්වා ඇත. එය objවස්තුවක දේපලක නමකි . ලූපයේ පළමු පුනරාවර්තනයේදී, propt"නම" වනු ඇත.


9

ජාවාස්ක්‍රිප්ට් හි ඇති වස්තු ගුණාංග එකතුවක් වන අතර එම නිසා සෑම ප්‍රකාශයක් සඳහාම එය ලූප කළ හැකිය.

objප්‍රධාන වටිනාකම් එකතුවක් ලෙස ඔබ සිතිය යුතුය .


! මෙම 'ගුණාංග ලැයිස්තුවට' යතුරු ලෙස නම් තිබිය හැකි වැදගත් වෙනස සමඟ, සාමාන්‍ය JS අරා වලට තිබිය හැක්කේ සංඛ්‍යා යතුරු ලෙස පමණි.
Qqwy

9

වර්තමානයේ ඔබට Symbol.iterator ක්‍රමයක් එකතු කිරීමෙන් සම්මත JS වස්තුවක් නැවත ලබා ගත හැකි වස්තුවක් බවට පරිවර්තනය කළ හැකිය. එවිට ඔබට for ofලූපයක් භාවිතා කර එහි අගයන් කෙලින්ම ලබා ගත හැකිය, නැතහොත් වස්තුව මත පැතිරීමේ ක්‍රියාකරුවෙකු භාවිතා කළ හැකිය. සිසිල්. අපි එය සාදා ගන්නේ කෙසේදැයි බලමු:

var o = {a:1,b:2,c:3},
    a = [];
o[Symbol.iterator] = function*(){
                       var ok = Object.keys(this);
                            i = 0;
                       while (i < ok.length) yield this[ok[i++]];
                     };
for (var value of o) console.log(value);
// or you can even do like
a = [...o];
console.log(a);


1
එය කිරීමට සිත්ගන්නා ක්‍රමයක්. function*සොයා ගැනීම සඳහා ස්තූතියි !
බෙන්ජ්

5

නෝඩ් ධාවනය කරන්නේ නම් මම නිර්දේශ කරමි:

Object.keys(obj).forEach((key, index) => {
    console.log(key);
});

5

ඉහළ ශ්‍රේණිගත කළ පිළිතුර නිවැරදි වුවත්, මෙන්න විකල්ප භාවිත අවස්ථාවකි, එනම් ඔබ වස්තුවක් හරහා නැවත ක්‍රියා කරන්නේ නම් සහ අවසානයේ අරාවක් නිර්මාණය කිරීමට අවශ්‍ය නම්. .mapවෙනුවට භාවිතා කරන්නforEach

const newObj = Object.keys(obj).map(el => {
    //ell will hold keys 
   // Getting the value of the keys should be as simple as obj[el]
})

4

පුනරාවර්තන මාර්ගයද එකතු කිරීම:

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]);
                }
            }
        }
    }
}

භාවිතය:

iterate({ foo: "foo", bar: { foo: "foo"} }); 

1
@faiz - මගේ අදහස් බලන්න, ඔබ පුනරාවර්තව චක්‍රීය යොමු කිරීම් සහිත
අගල

3

..ඉන් ලූපය සඳහා කරන්නේ එය නව විචල්‍යයක් (var someVariable) නිර්මාණය කර දී ඇති වස්තුවේ එක් එක් දේපල මෙම නව විචල්‍යය තුළ (යම් විචල්‍යතාවයකින්) එකින් එක ගබඩා කිරීමයි. එබැවින් ඔබ block block බ්ලොක් භාවිතා කරන්නේ නම්, ඔබට නැවත යෙදිය හැකිය. පහත උදාහරණය සලකා බලන්න.

var obj = {
     name:'raman',
     hobby:'coding',
     planet:'earth'
     };

for(var someVariable in obj) {
  //do nothing..
}

console.log(someVariable); // outputs planet

මෙය සරල කිරීම නිසා මෙය ඉහළ නැංවීම. මගේ භාවිතයේ දී, වස්තුවක ඇති සියලුම ගුණාංග පරීක්ෂා කර බැලිය යුතුය - NaNs, nulls, undefined (ඒවා ප්‍රස්ථාරයක ලකුණු වූ අතර මෙම අගයන් ප්‍රස්ථාරය ඇඳීම වලක්වන ලදි). නම වෙනුවට අගය ලබා ගැනීම සඳහා, ලූපය තුළ ඔබ කරන්නේ එයයි obj[someVariable]. සමහර විට එය එතරම් අවතක්සේරු කිරීමට හේතුව එය පුනරාවර්තන නොවන නිසා විය හැකිය. එබැවින් ඔබට ඉතා ව්‍යුහාත්මක වස්තුවක් තිබේ නම් මෙය ප්‍රමාණවත් විසඳුමක් නොවනු ඇත.
කැතරින් ඔස්බෝන්

At කැතරින් ඕස්බෝන් හෝ සමහර විට එසේ වන්නේ පහත දැක්වෙන වාක්‍ය ඛණ්ඩය තරමක් ගුප්ත නිසා විය හැකිය: "එබැවින් ඔබ block block බ්ලොක් භාවිතා කරන්නේ නම්, ඔබට නැවත යෙදිය හැකිය." කේතය පෙළට වඩා වැඩි යමක් පවසයි.
bvdb

3

මෙන්න මම සෑම නෝඩයක්ම නැවත සකසමින් අර්ථවත් නෝඩ් නම් නිර්මාණය කරමි. ඔබ දුටුවහොත්, instanceOf Array සහ instanceOf Object එකම දේම කරයි (මගේ යෙදුමේ, මම වෙනස් තර්කනයක් ලබා දුන්නද)

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]);
            }
        }
    }
}

සටහන - ඔන්ඩ්‍රෙජ් ස්වෙජ්ඩාර්ගේ පිළිතුරෙන් මා ආශ්වාදයක් ලැබීය. නමුත් මෙම විසඳුමට වඩා හොඳ කාර්ය සාධනයක් සහ අඩු අපැහැදිලි බවක් ඇත


3

ඔබට මූලික වශයෙන් අවශ්‍ය වන්නේ වස්තුවේ එක් එක් දේපල හරහා ලූපය.

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);

obj(prop)<- TypeError: obj යනු ශ්‍රිතයක් නොවේ
le_m

මගේ නරකයි. මම අහම්බෙන් එම hasOwnPropertyගුණාංගය ඉවත් කළ යුතුය . එය දැන් ක්‍රියාත්මක විය යුතුය.
හොවිටෙක්

2

ඔබට ජාවාස්ක්‍රිප්ට් වෙතින් වෙනස් අභිප්‍රායන් තිබිය හැකි නිසා ඉහත පිළිතුරු වලට එක් කිරීමට මට අවශ්‍යය. JSON වස්තුවක් සහ ජාවාස්ක්‍රිප්ට් වස්තුවක් වෙනස් දේවල් වන අතර, ඉහත යෝජනා කළ විසඳුම් භාවිතා කරමින් JSON වස්තුවක ගුණාංග හරහා නැවත කියවීමට ඔබට අවශ්‍ය විය හැකිය, පසුව පුදුම වන්න.

ඔබට JSON වස්තුවක් ඇතැයි සිතමු:

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

එහි 'ගුණාංග' හරහා නැවත කියවීමට වැරදි මාර්ගය:

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

ඔබ කොන්සෝලය ප්රවේශ වීම්, දැකීමේ පුදුමයට පත් විය හැකිය 0, 1ගුණ හරහා එල්ලාවල මහතා විට, ආදිය prop1හා prop2හාprop3_1 . එම වස්තූන් අනුක්‍රමයන් වන අතර අනුක්‍රමයක දර්ශක ජාවාස්ක්‍රිප්ට්හි ඇති එම වස්තුවේ ගුණාංග වේ.

JSON වස්තු ගුණාංග හරහා පුනරාවර්තනය වීමට වඩා හොඳ ක්‍රමයක් නම්, එම වස්තුව අනුක්‍රමයක් ද නැද්ද යන්න පළමුව පරීක්ෂා කිරීමයි:

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]);

            }

     }
}

1

තවදුරටත් බේරුම් කිරීමට පිළිගත් පිළිතුර එය වටිනා ඔබ සමග වස්තුව instantiate නම් බව සඳහන් var object = Object.create(null)පසුව object.hasOwnProperty(property)එය TypeError පුපුරවා හරිනු ඇත. එබැවින් ආරක්ෂිත පැත්තේ සිටීමට නම්, ඔබට එය මෙවැනි මූලාකෘතියෙන් ඇමතිය යුතුය:

for (var property in object) {
    if (Object.prototype.hasOwnProperty.call(object, property)) {
        // do stuff
    }
}


0

චෙක් වර්ගය

Propt විසින් වස්තු නිසි පරිදි නිරූපණය කරන්නේ කෙසේදැයි ඔබට පරීක්ෂා කළ හැකිය

typeof propt

එය හුදෙක් නූලක් (දේපල නම) බව සොයා ගැනීමට. for-inJs "ගොඩනංවන" ලූපය ක්‍රියා කරන ආකාරය නිසා එය වස්තුවේ සෑම දේපලක් සමඟම පැමිණේ .

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.