ජාවාස්ක්‍රිප්ට් වස්තුවක් හරහා මා ගණනය කරන්නේ කෙසේද?


2893

මට පහත දැක්වෙන පරිදි ජාවාස්ක්‍රිප්ට් වස්තුවක් ඇත:

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

දැන් මම සියල්ල හරහා පුඩුවක් කිරීමට අවශ්ය pමූලද්රව්ය ( p1, p2, p3...) ඔවුන්ගේ යතුරු හා අගයන් ලබා ගන්න. මට එය කළ හැක්කේ කෙසේද?

අවශ්‍ය නම් මට ජාවාස්ක්‍රිප්ට් වස්තුව වෙනස් කළ හැකිය. මගේ අවසාන ඉලක්කය වන්නේ යතුරු අගයන් කිහිපයක් හරහා ලූප වීම සහ හැකි නම් භාවිතා කිරීමෙන් වැළකී සිටීමයි eval.


9
වස්තු සාහිත්‍යය සහ JSON ව්‍යාකූල වීම වළක්වා ගැනීම සඳහා මම JSON ජාවාස්ක්‍රිප්ට් (වස්තුව) ලෙස වෙනස් කළෙමි.
ෆීලික්ස් ක්ලින්ග්

Answers:


4378

for-inඅන් අය පෙන්වා ඇති පරිදි ඔබට ලූපය භාවිතා කළ හැකිය . කෙසේ වෙතත්, ඔබට ලැබෙන යතුර වස්තුවක සත්‍ය දේපලක් බවත් එය මූලාකෘතියෙන් නොවන බවත් සහතික කර ගත යුතුය.

මෙන්න ස්නිපටය:

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

for (var key in p) {
    if (p.hasOwnProperty(key)) {
        console.log(key + " -> " + p[key]);
    }
}

Object.keys () විකල්පය සමඟ:

var p = {
    0: "value1",
    "b": "value2",
    key: "value3"
};

for (var key of Object.keys(p)) {
    console.log(key + " -> " + p[key])
}

for-ofඒ වෙනුවට භාවිතා කිරීම සැලකිල්ලට ගන්න for-in, එය භාවිතා නොකළ හොත් එය නම් කරන ලද ගුණාංග මත නිර්වචනය නොකෙරේ, සහ Object.keys()සමස්ත මූලාකෘති-දාම ගුණාංග නොමැතිව වස්තුවේ ගුණාංග පමණක් භාවිතා කිරීම සහතික කරයි.

නව Object.entries()ක්‍රමය භාවිතා කිරීම :

සටහන: මෙම ක්‍රමයට ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් විසින් දේශීයව සහය නොදක්වයි. පැරණි බ්‍රව්සර් සඳහා පොලිෆිල් එකක් භාවිතා කිරීම ගැන සලකා බැලිය හැකිය.

const p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

for (let [key, value] of Object.entries(p)) {
  console.log(`${key}: ${value}`);
}

34
පැහැදිලි කිරීම සඳහා ඔබ ඇඟවීම් රේඛාව වෙනස් කිරීමට යෝජනා කරයිalert(key + " -> " + JSON.stringify(p[key]));
ස්ටීව් මිඩ්ග්ලි

80
HasOwnProperty හි අවශ්‍යතාවය ඔබට පැහැදිලි කළ හැකිද? මූලාකෘතියෙන් ඔබ අදහස් කරන්නේ කුමක්ද?
kamaci

331
ජාවාස්ක්‍රිප්ට් හි, සෑම වස්තුවකටම මෙටා-තොරතුරු ඇති යතුරු-වටිනා යුගල යුගලයක් ඇත. වස්තුවක් සඳහා සියලු යතුරු අගය යුගල හරහා ඔබ ලූප් කරන විට ඔබ ඒවා හරහා ද ලූප් කරයි. hasOwnPropery () මේවා පෙරහන් කරයි.
danieltalsky

57
ඇත්ත වශයෙන්ම, For ... in ඉවත් නොකෙරේ. එක් එක් ... සඳහා වේ. නමුත් මම ඇත්තටම පුරාවිද්‍යා ologists යින් යන යෙදුමට කැමතියි ... මට එය භාවිතා කිරීමට පටන් ගත යුතුය.
බෙන් වයි

17
ජාවාස්ක්‍රිප්ට් හි ඇති සෑම වස්තුවකටම (ඇත්ත වශයෙන්ම යතුරු-අගය යුගලයක්) __proto__හෝ හැඳින්වෙන දේපලක් prototypeඇත. මෙම දේපලෙහි මව් වස්තුව පිළිබඳ සඳහනක් ඇත. වස්තුවක් ස්වයංක්‍රීයව තම මවුපියන්ගෙන් දේපළ උරුම කර ගනී. භාවිතා කිරීමට හේතුව මෙයයි hasOwnProperty, එයින් අදහස් කරන්නේ අප උනන්දු වන්නේ වස්තූන් සතු දේපළක් මිස එහි මවුපියන් නොවන බවයි.
සුබෙයාර් අලාම්

1109

සම්මතයන් 5 යටතේ, ඔබ ඒකාබද්ධ කළ හැකි Object.keys()හා Array.prototype.forEach():

var obj = { first: "John", last: "Doe" };

Object.keys(obj).forEach(function(key) {
    console.log(key, obj[key]);
});

ECMAScript 6 එකතු කරයි for...of:

for (const key of Object.keys(obj)) {
    console.log(key, obj[key]);
}

Object.entries()මුල් වස්තුවෙහි එක් එක් අගය සොයා බැලීම වළක්වන ECMAScript 8 එකතු කරයි :

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

ඔබට ඒකාබද්ධ කළ හැකිය for...of, විනාශ කළ හැකිය , සහ Object.entries:

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

දෙකම Object.keys()සහ Object.entries()අනුකාරක ගුණාංග for...inලූපයක් ලෙස එකම අනුපිළිවෙලින් ඇති නමුත් මූලාකෘති දාමය නොසලකා හරින්න . පුනරාවර්තනය වන්නේ වස්තුවේ ම ගණන් කළ හැකි ගුණාංග පමණි.


21
ප්‍රමිතිය ලබා නොදෙන්නේ ඇයි Object.forEach(obj, function (value, key) {...})? :( නිසැකවම obj.forEach(function...)කෙටි හා අනුපූරක වනු ඇත Array.prototype.forEach, නමුත් එමඟින් වස්තූන් ඔවුන්ගේ forEachදේපළ නිර්වචනය කිරීමේ අවදානමක් Object.keysඇත.අපේ ඇමතුමට එරෙහිව ආරක්ෂකයින් වස්තුවේ යතුරු වෙනස් කිරීම වළක්වනු ඇතැයි මම සිතමි .
ඩේවිඩ් හාර්ක්නස්

7
Object.forEach = function (obj, callback) { Object.keys(obj).forEach(function (key) { callback(obj[key], key); }); }
ඩේවිඩ් හාර්ක්නස්

7
Av ඩේවිඩ්හාර්ක්නස් ES2017 හි Object.entries ඇත. එහිදී ඔබට පහත සඳහන් දෑ කළ හැකිය: Object.entries(obj).map/forEach(([key, value]) => console.log(key, value))([යතුර, වටිනාකම] අරාව විනාශ
කිරීමකි,

මම indexjson හි යතුර ලබා ගන්නේ කෙසේද ? හෝ අවශ්‍ය නම් මම වෙනම කවුන්ටරයක් ​​භාවිතා කළ යුතුද?
සරවනබලාගි රාමචන්ද්‍රන්

3
for...ofES6 ප්‍රමිතිය මිස ES2016 නොවේ.
රැක්ස් වෙබර්

342

ඔබ භාවිතා කළ යුතුයි for-in loop යුතුය

නමුත් මේ ආකාරයේ ලූපයක් භාවිතා කිරීමේදී ඉතා ප්‍රවේශම් වන්න, මන්ද මෙය මූලාකෘති දාමය ඔස්සේ සියලු ගුණාංග ලූප් කරනු ඇත .

එම නිසා, ලූප සඳහා ලූප භාවිතා කරන විට, hasOwnPropertyපුනරාවර්තනයේ වත්මන් දේපල සැබවින්ම ඔබ පරික්ෂා කරන වස්තුවේ දේපලක් දැයි තීරණය කිරීමට ක්‍රමවේදය භාවිතා කරන්න :

for (var prop in p) {
    if (!p.hasOwnProperty(prop)) {
        //The current property is not a direct property of p
        continue;
    }
    //Do your logic with the property here
}

31
මෙය ලෙවික්ගේ විසඳුමට වඩා හොඳය, මන්ද එය ප්‍රධාන තර්කනය දෙකකට වඩා එක් කැදැලි පුඩුවක් පමණක් වීමට ඉඩ සලසයි; කේතය කියවීම පහසු කිරීම සඳහා. දිගටම කරගෙන යාමේ වරහන් මම ලිහිල් කළත්; ඒවා අතිරික්තයි.
SystemicPlural

52
මම { }පෞද්ගලිකව ඉවත් ifනොකරන්නේ ඔවුන් නොමැතිව එය එහි කොටසක් ifසහ නැති දේ ටිකක් අපැහැදිලි නිසා ය. නමුත් මම හිතන්නේ එය කාරණයක් පමණයි :)
pimvdb

34
ඔව්, { }පසුකාලීනව ifවිෂය පථයට යමක් එකතු කිරීමට අවශ්‍ය නම් ව්‍යාකූලත්වය වළක්වා ගැනීම සඳහා ප්‍රධාන වශයෙන් තබා ගැනීමට මම කැමැත්තෙමි .
ඇන්ඩ්‍රියාස් ග්‍රීච්

8
මගේ පෙර අදහස් කියවන විට, මම නිවැරදි යෙදුම් භාවිතා නොකළ බව මට වැටහුණි, මන්ද මම “විෂය පථය නම්” යැයි පැවසූ නිසා; නමුත් ජාවාස්ක්‍රිප්ට් සතුව ඇත්තේ විෂය පථය පමණක් බව මතක තබා ගන්න. ඉතින් මම ඇත්තටම අදහස් කළේ "අවහිර නම්" යන්නයි.
ඇන්ඩ්‍රියාස් ග්‍රීච්

1
eomeroff, ඔබ ඒ ගැන සැබවින්ම සැලකිලිමත් වන්නේ නම්, ඔබට සැමවිටම මෙවැනි දෙයක් කළ හැකිය: Object.prototype.hasOwnProperty.call(p, prop) කෙසේ වෙතත්, මෙයද Object.prototype හි උපාමාරු වලින් ආරක්ෂා විය නොහැක ...
jordancpaul

251

වස්තූන් හරහා ලූප වීම සඳහා විකල්ප ක්‍රම ගැන අප සඳහන් නොකරන්නේ නම් ප්‍රශ්නය සම්පූර්ණ නොවේ.

වර්තමානයේ බොහෝ ප්‍රසිද්ධ ජාවාස්ක්‍රිප්ට් පුස්තකාල එකතු කිරීම, එනම් අරා , වස්තූන් සහ අරාව වැනි වස්තූන් හරහා නැවත යෙදීම සඳහා තමන්ගේම ක්‍රමවේදයන් සපයයි . මෙම ක්‍රම භාවිතා කිරීමට පහසු වන අතර ඕනෑම බ්‍රව්සරයක් සමඟ සම්පූර්ණයෙන්ම අනුකූල වේ.

  1. ඔබ jQuery සමඟ වැඩ කරන්නේ නම් , ඔබට jQuery.each()ක්‍රමයක් භාවිතා කළ හැකිය . වස්තූන් සහ අරා යන දෙකටම බාධාවකින් තොරව නැවත යෙදීම සඳහා එය භාවිතා කළ හැකිය:

    $.each(obj, function(key, value) {
        console.log(key, value);
    });
  2. දී Underscore.js ඔබ ක්රමය සොයා ගත හැකි _.each()සැපයූ කටයුතු කිරීමට අනෙක් අතට එක් එක් අස්වැන්නක්, මූලද්රව්ය ලැයිස්තුවක් කට දයානන්ද් වන, (දී තර්ක අනුපිළිවෙල වැටුප් අවධානය iteratee කාර්යය!):

    _.each(obj, function(value, key) {
        console.log(key, value);
    });
  3. Lo-Dash මඟින් වස්තු ගුණාංග නැවත සැකසීම සඳහා ක්‍රම කිහිපයක් සපයයි. මූලික _.forEach()(හෝ එය අන්වර්ථය _.each()) වස්තු සහ අරා යන දෙවර්ගයම හරහා ලූප සඳහා ප්‍රයෝජනවත් වේ, කෙසේ වෙතත් (!) lengthදේපල ඇති වස්තූන් අරා මෙන් සලකනු ලැබේ, මෙම හැසිරීම වළක්වා ගැනීම සඳහා එය භාවිතා කිරීමට යෝජනා කර ඇත _.forIn()සහ _.forOwn()ක්‍රම (මේවාට ද මුලින් valueතර්කය පැමිණේ):

    _.forIn(obj, function(value, key) {
        console.log(key, value);
    });

    _.forIn()කට දයානන්ද් ම හා උරුම , වස්තුවක ගණ්ය ගුණ අතර _.forOwn()පමණක් කට දයානන්ද් වස්තුවක ගුණ (මූලික වශයෙන් එරෙහිව පරීක්ෂා hasOwnPropertyකාර්යය). සරල වස්තූන් සහ වස්තු සාහිත්‍යකරුවන් සඳහා මෙම ඕනෑම ක්‍රමයක් හොඳින් ක්‍රියාත්මක වේ.

සාමාන්‍යයෙන් විස්තර කර ඇති සියලුම ක්‍රම ඕනෑම සැපයුම් වස්තුවක් සමඟ එකම හැසිරීමක් ඇත. ස්වදේශික for..inපුඩුවක් භාවිතා කිරීමට අමතරව සාමාන්‍යයෙන් ඕනෑම සාරාංශයකට වඩා වේගවත් වනු ඇත , එනම් jQuery.each(), මෙම ක්‍රම භාවිතා කිරීම සැලකිය යුතු ලෙස පහසුය, අඩු කේතීකරණයක් අවශ්‍ය වන අතර වඩා හොඳ දෝෂ හැසිරවීමක් සපයයි.


4
අගය ලබා ගැනීම සඳහා: $ .එම (වස්තුව, ශ්‍රිතය (යතුර, අගය) {console.log (value.title);});
රවී රාම්

2
අවධාරනය හා jquery පරාමිතීන් වෙනස් කළ ආකාරය විහිළුවක් :)
ppasler

52

ECMAScript 5 හි ඔබට වචනාර්ථයෙන් පුනරාවර්තන ක්ෂේත්‍රයන්හි නව ප්‍රවේශයක් ඇත - Object.keys

වැඩි විස්තර ඔබට දැක ගත හැකිය MDN හි

වර්තමාන බ්‍රව්සර් සංස්කරණවල (Chrome30, IE10, FF25) වේගවත් විසඳුමක් ලෙස මගේ තේරීම පහතින්.

var keys = Object.keys(p),
    len = keys.length,
    i = 0,
    prop,
    value;
while (i < len) {
    prop = keys[i];
    value = p[prop];
    i += 1;
}

ඔබට මෙම ප්‍රවේශයේ ක්‍රියාකාරිත්වය jsperf.com හි විවිධ ක්‍රියාත්මක කිරීම් සමඟ සැසඳිය හැකිය :

ඔබට දැකිය හැකි බ්‍රව්සර සහාය කැන්ගාක්ස්ගේ අනුකූලතා වගුවේ

පැරණි බ්‍රව්සරය සඳහා ඔබට සරල හා පූර්ණ පොලිෆිල් ඇත

UPD:

මෙම ප්‍රශ්නයේ සියලුම ජනප්‍රිය අවස්ථා සඳහා කාර්ය සාධනය සංසන්දනය perfjs.info:

වස්තු වචනාර්ථයෙන් නැවත කිරීම


ඇත්ත වශයෙන්ම, මට අවශ්‍ය වූයේ මෙම ක්‍රමය පළ කිරීමට ය. නමුත් ඔබ මට එයට පහර දුන්නා :(
ජේමි හට්බර්

50

පෙරවදන:

  • වස්තුවක ගුණාංගයන්ගේ විය හැක (දේපල වස්තුව ම මත ය) හෝ උරුම (නොවේ වස්තුව ම මත, එහි මූලාකෘති එකක්).
  • වස්තුවක ගුණාංගයන්ගේ විය හැකි ගණ්ය හෝ නොවන ගණ්ය . ගණනය කළ නොහැකි දේපල දේපල ගණන් කිරීම් / අරා වලින් ඉතිරි වේ.
  • දේපල නම් නූල් හෝ සංකේත විය හැකිය. සංකේත නම් කරන දේපල දේපල ගණන් කිරීම් / අරා වලින් ඉවත් වේ.

මෙන්න 2018 දී, වස්තුවක ගුණාංග හරහා ඔබේ විකල්පයන් වේ (සමහර උදාහරණ ලැයිස්තුව අනුගමනය කරයි):

  1. for-in[ MDN , spec ] - උරුම වූ ඒවා ඇතුළුව වස්තුවක ගණන් කළ නොහැකි ගුණාංගවල නම් හරහා ලූපයක් වන ලූප ව්‍යුහයක්
  2. Object.keys[ MDN , පිරිවිතර ] - වස්තුවක් ගේ නම් රැසක් ලබා දීමේ උත්සවයක් , ගණ්ය කාගේ නම් නූල් වේ ගුණ.
  3. Object.values[ MDN , spec ] - වස්තුවක , ගණන් කළ නොහැකි ගුණාංගවල අගයන් රාශියක් සපයන ශ්‍රිතයකි .
  4. Object.entries[ MDN , පිරිවිතර ] - නම් රැසක් ලබා දීමේ උත්සවයක් හා වස්තුවක් ගේ වටිනාකම් , ගණ්ය ගුණ (අරාව තුළ සෑම ඇතුලත් වන්නේ [name, value]අරා).
  5. Object.getOwnPropertyNames[ MDN , spec ] - වස්තුවක ස්වකීය ගුණාංගවල (ගණන් කළ නොහැකි ඒවා පවා) නම් පෙළක් සපයන ශ්‍රිතයකි .
  6. Object.getOwnPropertySymbols[ MDN , spec ] - සංකේතයක් වන වස්තුවක ස්වකීය දේපලවල (ගණන් කළ නොහැකි ඒවා පවා) නම් පෙළක් සපයන ශ්‍රිතයකි .
  7. Reflect.ownKeys[ MDN , පිරිවිතර ] - වස්තුවක් ගේ නම් රැසක් ලබා දීමේ උත්සවයක් ගුණ (පවා-ගණ්ය නොවන අය), එම නම් නූල් හෝ සංකේත යන්න.
  8. ඔබට අවශ්ය නම් සියලුම -ගණ්ය නොවන උරුම අය ඇතුළු වස්තුවක් ගුණ,, ඔබට, චක්රයක් සහ භාවිතා කිරීමට අවශ්ය Object.getPrototypeOf[ MDN , පිරිවිතර ] හා භාවිතය Object.getOwnPropertyNames, Object.getOwnPropertySymbolsහෝ Reflect.ownKeysඑක් එක් වස්තුවක් මත පතිරූපක දාම (මෙම පිළිතුර පහළ උදාහරණයක් ලෙස) දී.

හැර ඒවා සියල්ල for-in, ඔබ අරාවක් මත ඉදිකිරීමක් ප්රහාරක යම් ආකාරයක භාවිතා කියලා ( for, for-of, forEach, ආදිය).

උදාහරණ:

for-in:

Object.keys ( for-ofලූපයක් සමඟ , නමුත් ඔබට ඕනෑම ලූප ඉදිකිරීමක් භාවිතා කළ හැකිය) :

Object.values:

Object.entries:

Object.getOwnPropertyNames:

Object.getOwnPropertySymbols:

Reflect.ownKeys:

උරුම වූ ගණන් කළ නොහැකි ඒවා ඇතුළුව සියලු දේපල :


ගණන් කළ නොහැකි / ගණනය කළ නොහැකි වස්තු ගුණාංග එකතු කිරීම.
serraosays

49

ඔබට එය නැවත නැවත කළ හැකිය:

for (var key in p) {
  alert(p[key]);
}

keyදේපලෙහි වටිනාකම නොසලකන බව සලකන්න , එය දර්ශක අගයක් පමණි.


14
මෙය පුනරාවර්තනය වන අතර එය සම්පූර්ණයෙන්ම නිවැරදි නොවේ. මෙම කාර්යය නිසියාකාරව සිදු කිරීම සඳහා ඔබට hasOwnProperty පරීක්‍ෂණයක් කළ යුතුය
Vatsal

4
ඉහත පිළිතුර මත පදනම්ව මම මුලින් මෙය පහත් කොට සලකනු ලැබුවේ මෙම පිළිතුර මුලින්ම පැමිණි බව මට වැටහෙන තුරු, එබැවින් "නැවත නැවත" නොවේ. එය අසම්පූර්ණ විය හැකි නමුත් බොහෝ අවස්ථාවන් සඳහා එය හොඳින් ක්‍රියාත්මක වේ.
billynoah

27

Es2015 වඩ වඩාත් ජනප්‍රිය වෙමින් පවතින බැවින් මම මෙම පිළිතුර පළ කරන්නේ [key, value]යුගල හරහා සුමටව නැවත ගමන් කිරීම සඳහා උත්පාදක යන්ත්රය සහ ඉරේටරය භාවිතා කිරීම ය . වෙනත් භාෂාවලින් හැකි පරිදි රූබි.

හරි මෙන්න කේතයක්:

const MyObject = {
  'a': 'Hello',
  'b': 'it\'s',
  'c': 'me',
  'd': 'you',
  'e': 'looking',
  'f': 'for',
  [Symbol.iterator]: function* () {
    for (const i of Object.keys(this)) {
      yield [i, this[i]];
    }
  }
};

for (const [k, v] of MyObject) {
  console.log(`Here is key ${k} and here is value ${v}`);
}

සංවර්ධක මොසිල්ලා පිටුවෙන් ඔබට සොයාගත හැකි ඉරේටරයක් ​​සහ ජනක යන්ත්‍රයක් කරන්නේ කෙසේද යන්න පිළිබඳ සියලු තොරතුරු.

එය යමෙකුට උපකාර කරනු ඇතැයි සිතමි.

සංස්කරණය කරන්න:

ES2017 ට ඇතුළත් Object.entriesවන අතර එමඟින් [key, value]වස්තූන්ගේ යුගල හරහා නැවත ක්‍රියා කිරීම වඩාත් පහසු වේ. Ts39 අනුව එය ප්‍රමිතියක කොටසක් වනු ඇති බව දැන් දන්නා කරුණකි අදියර තොරතුරු .

මම හිතන්නේ මගේ පිළිතුර යාවත්කාලීන කිරීමට කාලය පැමිණ ඇති අතර එය දැන් පවතින තත්වයට වඩා නැවුම් බවට පත්වේ.

const MyObject = {
  'a': 'Hello',
  'b': 'it\'s',
  'c': 'me',
  'd': 'you',
  'e': 'looking',
  'f': 'for',
};

for (const [k, v] of Object.entries(MyObject)) {
  console.log(`Here is key ${k} and here is value ${v}`);
}

MDN පිටුවෙන් ඔබට භාවිතය පිළිබඳ වැඩි විස්තර සොයාගත හැකිය


මෙය මුළුමනින්ම අනවශ්‍ය / අනවශ්‍ය බව මට පෙනේ. ඔබේ පද්ධතියේ සෑම වස්තුවකටම ඔබ එය එකතු කරනවාද? මම සිතුවේ ඉරේටරයක් ​​සැපයීමේ කාරණය ඔබට 'මගේ (වස්තුව සඳහා) (const [k, v]' කළ හැකි වන පරිදි ය. එය පෙනෙන්නේ අමතර කේතයක් අතිරේක වටිනාකමක් ලබා දෙන බවයි.
ඩීන් රැඩ්ක්ලිෆ්

22
for(key in p) {
  alert( p[key] );
}

සටහන: ඔබට මෙය අරා හරහා කළ හැකිය, නමුත් ඔබ lengthසහ අනෙකුත් ගුණාංග ද නැවත කියනු ඇත .


4
ඒ සඳහා ලූපයක් භාවිතා කරන විට, keyදර්ශක අගයක් පමණක් ගනු ඇත, එවිට එය 0, 1, 2 යනාදිය දැනුම් දෙනු ඇත ... ඔබට p [key] වෙත පිවිසිය යුතුය.
බ්‍රයන්

1
එය ජාවාස්ක්‍රිප්ට් හි අරාව පුනරාවර්තනය කිරීමේ මන්දගාමී ක්‍රමයයි. ඔබට මෙය ඔබේ පරිගණකයෙන් පරික්ෂා කළ හැකිය
පෙන්ක්‍රොෆ්

5
En පෙන්ක්‍රොෆ්: ගැටලුව වන්නේ ප්‍රශ්නය අරා හරහා
ලූප

මෙය ස්ටක් ඕවර් ප්‍රවාහය ගැන මට නොතේරෙන දෙයක්. රිචඩ් නිවැරදි පිළිතුර ලබා දුන් අතර, එම පිළිතුර දුන් පළමු තැනැත්තා ඔහුය, නමුත් ඔහුට +1 ලැබුණේ නැත? Ry බ්‍රයන් var p = {"p1":"q","p2":"w"}; for(key in p) { alert( key ); }"p1" සහ "p2" ඇඟවීම් වලින් පුරවා ඇත, එබැවින් එහි ඇති වැරැද්ද කුමක්ද ???
සෙබස්තියන්

5
මම හිතන්නේ ප්‍රධාන වෙනස වන්නේ ගුණාත්මක භාවයයි: අනෙක් පිළිතුරු පවසන්නේ කෙසේද යන්න පමණක් නොව, අවවාද (උදා: මූලාකෘතිය) සහ එම අනතුරු ඇඟවීම් සමඟ කටයුතු කරන්නේ කෙසේද යන්න පවසන්න. IMHO, එම අනෙක් පිළිතුරු ඇත මට වඩා හොඳ :).
රිචඩ් ලෙවෙසියර්

20

මෙහි ඇති සියලුම පිළිතුරු සොයා බැලීමෙන් පසු, මගේ json වස්තුව පිරිසිදු බැවින් මගේ භාවිතය සඳහා hasOwnProperty අවශ්‍ය නොවේ; අමතර ජාවාස්ක්‍රිප්ට් සැකසුම් එකතු කිරීමේ කිසිදු තේරුමක් නැත. මම භාවිතා කරන්නේ මෙයයි:

for (var key in p) {
    console.log(key + ' => ' + p[key]);
    // key is key
    // value is p[key]
}

18
JSON වස්තුව පිරිසිදුද නැද්ද යන්න අදාල නොවේ. වෙනත් ඕනෑම වේලාවක කිසියම් කේතයක් දේපලක් සකසන්නේ නම් Object.prototype, එය ගණනය කරනු ලැබේ for..in. ඔබ එය කරන කිසිදු පුස්තකාලයක් භාවිතා නොකරන බව ඔබට විශ්වාස නම්, ඔබට ඇමතිය යුතු නැත hasOwnProperty.
ජී-විස්

4
මෙය නිර්මාණය කර ඇත්නම් එය සම්පූර්ණයෙන්ම පිරිසිදු කළ හැකියObject.create(null)
ජුවාන් මෙන්ඩිස්

20

forEach () සමඟ මූලාකෘති හරහා මූලාකෘති දාම ගුණාංග මඟ හැරිය යුතුය :

Object.prototype.each = function(f) {
    var obj = this
    Object.keys(obj).forEach( function(key) { 
        f( key , obj[key] ) 
    });
}


//print all keys and values
var obj = {a:1,b:2,c:3}
obj.each(function(key,value) { console.log(key + " " + value) });
// a 1
// b 2
// c 3

2
මූලාකෘතිය සමඟ ප්‍රවේශම් වන්න: obj = { print: 1, each: 2, word: 3 }නිෂ්පාදනය කරයි TypeError: number is not a function. forEachසමාන Arrayශ්‍රිතයට ගැලපෙන ලෙස භාවිතා කිරීම අවදානම තරමක් අඩු කළ හැකිය.
ඩේවිඩ් හාර්ක්නස්

18

එය එම පිළිතුරු ජනතාව යන දෙදෙනා මත ම ස්පර්ශ කර රසවත් දෙයක් Object.keys()හා for...ofනමුත් ඒවා ඒකාබද්ධ කවදාවත්:

var map = {well:'hello', there:'!'};
for (let key of Object.keys(map))
    console.log(key + ':' + map[key]);

ඔබ පමණක් නොව හැකි for...ofවූ Objectඑය iterator නැහැ, නිසා for...indexහෝ .forEach()විශ්වවිද්යාලයට ද Object.keys()කැත / අකාර්යක්ෂම වේ.
බොහෝ අය for...in(පරීක්ෂා කිරීමකින් හෝ රහිතව .hasOwnProperty()) වැළකී සිටීම ගැන මම සතුටු වෙමි, එයද ටිකක් අවුල් සහගතය, එබැවින් ඉහත මගේ පිළිතුරට අමතරව, මම මෙහි කීමට ...


ඔබට සාමාන්‍ය වස්තු සංගම් නැවත සැකසිය හැක! Mapfor...ofක්‍රෝම් සහ එෆ්එෆ් හි වැඩ කරන විසිතුරු
ඩෙමෝ සෘජුවම භාවිතා කරමින් s මෙන් හැසිරීම (මම උපකල්පනය කරන්නේ ES6 පමණි)

var ordinaryObject = {well:'hello', there:'!'};
for (let pair of ordinaryObject)
    //key:value
    console.log(pair[0] + ':' + pair[1]);

//or
for (let [key, value] of ordinaryObject)
    console.log(key + ':' + value);

ඔබ මගේ ෂිම් එක පහතින් ඇතුළත් කරන තාක් කල්:

//makes all objects iterable just like Maps!!! YAY
//iterates over Object.keys() (which already ignores prototype chain for us)
Object.prototype[Symbol.iterator] = function() {
    var keys = Object.keys(this)[Symbol.iterator]();
    var obj = this;
    var output;
    return {next:function() {
        if (!(output = keys.next()).done)
            output.value = [output.value, obj[output.value]];
        return output;
    }};
};

නියම සින්ටැක්ටික් සීනි නොමැති සැබෑ සිතියම් වස්තුවක් නිර්මාණය නොකර.

var trueMap = new Map([['well', 'hello'], ['there', '!']]);
for (let pair of trueMap)
    console.log(pair[0] + ':' + pair[1]);

ඇත්ත වශයෙන්ම, මෙම ෂිම් සමඟ, ඔබට තවමත් සිතියමේ අනෙකුත් ක්‍රියාකාරිත්වයන්ගෙන් ප්‍රයෝජන ගැනීමට අවශ්‍ය නම් (ඒවා සියල්ලම දිලිසීමෙන් තොරව) නමුත් තවමත් පිළිවෙලින් වස්තු අංකනය භාවිතා කිරීමට අවශ්‍ය නම්, වස්තූන් දැන් නැවත ක්‍රියාත්මක කළ හැකි බැවින් ඔබට දැන් එයින් සිතියමක් සාදා ගත හැකිය!

//shown in demo
var realMap = new Map({well:'hello', there:'!'});

දිලිසීමට හෝ prototypeපොදුවේ අවුල් කිරීමට අකමැති අයට , ඒ වෙනුවට කවුළුව මත ක්‍රියාකාරිත්වය කිරීමට නිදහස්ව සිටින්න , එය එවැන්නක් ලෙස හැඳින්වේ getObjIterator();

//no prototype manipulation
function getObjIterator(obj) {
    //create a dummy object instead of adding functionality to all objects
    var iterator = new Object();

    //give it what the shim does but as its own local property
    iterator[Symbol.iterator] = function() {
        var keys = Object.keys(obj)[Symbol.iterator]();
        var output;

        return {next:function() {
            if (!(output = keys.next()).done)
                output.value = [output.value, obj[output.value]];
            return output;
        }};
    };

    return iterator;
}

දැන් ඔබට එය සාමාන්‍ය ශ්‍රිතයක් ලෙස හැඳින්විය හැකිය, වෙන කිසිවක් බලපාන්නේ නැත

var realMap = new Map(getObjIterator({well:'hello', there:'!'}))

හෝ

for (let pair of getObjIterator(ordinaryObject))

එය ක්‍රියාත්මක නොවීමට හේතුවක් නැත.

අනාගතයට සාදරයෙන් පිළිගනිමු.


1
නඩුව තුළ ලක්ෂ්ය . මිනිසුන් පහළට අනුචලනය කර එය ප්‍රයෝජනවත් යැයි සිතන තාක් කල්, එය වැදගත් ය. සාමාන්‍යයෙන් මම යමක් කිරීමට උත්සාහ කරමි, මා සබැඳිව දකින දේට අකමැති වීම, එය හදුනා ගැනීම අවසන් කිරීම, පසුව මම නැවත බෙදා ගැනීමට පැමිණේ. එය හොඳ ඩෝකෝ ය, මට සම්පූර්ණයෙන්ම අමතක වී ඇති දේවල් ගොග්ල් කිරීමට පෙර මගේ පිළිතුරු මට හමු විය!
හැෂ්බ්‍රවුන්

ElHelpMeStackOverflowMyOnlyHope මා විසින්ම නිර්වචනය නොකළ වස්තූන්ගේ මූලාකෘති වෙනස් කිරීමට මම පෞද්ගලිකව කැමති නැත.
ජැනස් ට්‍රොල්සන්

An ජැනස් ට්‍රොල්සන් ඔබ සම්පූර්ණ පිළිතුර පවා කියවා තිබේද? For those who don't like to shim, or mess with prototype in general, feel free to make the function on window instead, calling it something like getObjIterator() then;
හැෂ්බ්‍රවුන්

මෙම තාක්ෂණය සරල වස්තූන් මත ක්‍රියා නොකරන බව සලකන්න.
noɥʇʎԀʎzɐɹƆ

එය සරල වස්තූන් සඳහා ක්‍රියා කරයි, එය වචනාර්ථයෙන් සමස්ත ලක්ෂ්‍යයයි (එමෙන්ම ordinaryObjectමැජික් තවමත් එම වර්ග සඳහා ක්‍රියා කරන බව අවධාරණය කිරීම වැනි විචල්‍ය නම් ). ඔබ නිරූපණ පරීක්ෂා කළාද; ඔබ වෙනුවෙන් වැඩ නොකරන්නේ කුමක්ද, @ noɥʇʎԀʎzɐɹƆ? (PS ඔබේ SE පැතිකඩ රූපය ලොක්කා වේ)
හැෂ්බ්‍රවුන්

13

Object.keys (obj): අරාව

සියළුම ගණනය කළ හැකි (උරුම නොවන) ගුණාංගවල නූල්-වටිනා යතුරු ලබා ගනී.

එබැවින් එය එක් එක් වස්තු යතුර hasOwnProperty සමඟ පරීක්ෂා කිරීමෙන් ඔබ අදහස් කරන යතුරු ලැයිස්තුවම ලබා දෙයි. ඔබට වඩා අමතර පරීක්ෂණ මෙහෙයුමක් අවශ්‍ය නොවන Object.keys( obj ).forEach(function( key ){})අතර එය වේගවත් විය යුතුය. එය ඔප්පු කරමු:

var uniqid = function(){
			var text = "",
					i = 0,
					possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
			for( ; i < 32; i++ ) {
					text += possible.charAt( Math.floor( Math.random() * possible.length ) );
			}
			return text;
		}, 
		CYCLES = 100000,
		obj = {}, 
		p1,
		p2,
		p3,
		key;

// Populate object with random properties
Array.apply( null, Array( CYCLES ) ).forEach(function(){
	obj[ uniqid() ] = new Date()
});

// Approach #1
p1 = performance.now();
Object.keys( obj ).forEach(function( key ){
	var waste = obj[ key ];
});

p2 = performance.now();
console.log( "Object.keys approach took " + (p2 - p1) + " milliseconds.");

// Approach #2
for( key in obj ) {
	if ( obj.hasOwnProperty( key ) ) {
		var waste = obj[ key ];
	}
}

p3 = performance.now();
console.log( "for...in/hasOwnProperty approach took " + (p3 - p2) + " milliseconds.");

මගේ ෆයර්ෆොක්ස් හි මට පහත ප්‍රති .ල ඇත

  • Object.keys ප්‍රවේශය සඳහා මිලි තත්පර 40.21101451665163 ක් ගතවිය.
  • සඳහා ... in / hasOwnProperty ප්‍රවේශය සඳහා මිලි තත්පර 98.26163508463651 ක් ගතවිය.

පීඑස්. ක්‍රෝම් හි වෙනස ඊටත් වඩා විශාලයි http://codepen.io/dsheiko/pen/JdrqXa

PS2: ES6 (EcmaScript 2015) හි ඔබට නැවත කියවිය හැකි වස්තුව වඩාත් හොඳින් කියවිය හැකිය:

let map = new Map().set('a', 1).set('b', 2);
for (let pair of map) {
    console.log(pair);
}

// OR 
let map = new Map([
    [false, 'no'],
    [true,  'yes'],
]);
map.forEach((value, key) => {
    console.log(key, value);
});


of Map
ation

13

වස්තුවක් හරහා නැවත යෙදීමට තවත් ක්‍රමයක් මෙන්න.

   var p = {
"p1": "value1",
"p2": "value2",
"p3": "value3"
};


Object.keys(p).forEach(key => { console.log(key, p[key]) })


3
මෙය ඉතා සිසිල් ය, කෙසේ වෙතත් විශාල වස්තූන් සඳහා, forක්‍රමය වඩාත් ක්‍රියාකාරී විය හැකිය.
රොල්ෆ්


12

ඔබට Object.keys () භාවිතා කළ හැකි අතර අගය ලබා ගැනීම සඳහා පහත වැනි වස්තු යතුරු හරහා නැවත කියන්න:

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

Object.keys(p).forEach((key)=> {
 console.log(key +' -> '+ p[key]);
});


ඔබ මගේ කාලය ඉතිරි කළා, ස්තූතියි
Swap-IOS-Android

දැන ගැනීමට ලැබීම සතුටක් :)
ඔනෙරා

9

කාර්ය සාධනය

අද 2020.03.06 මැක් ඕස් හි සියෙරා v10.13.6 හි ක්‍රෝම් v80.0, සෆාරි v13.0.5 සහ ෆයර්ෆොක්ස් 73.0.1 මත තෝරාගත් විසඳුම් පරීක්ෂා කරමි.

නිගමන

  • for-in(A, B) මත පදනම් වූ විසඳුම් විශාල හා කුඩා වස්තු සඳහා සියලුම බ්‍රව්සර් සඳහා වේගවත් (හෝ වේගවත්) වේ
  • පුදුමයට කරුණක් නම් for-of(H) ද්‍රාවණය කුඩා හා විශාල වස්තු සඳහා ක්‍රෝම් මත වේගවත් වීමයි
  • පැහැදිලි දර්ශකය මත පදනම් වූ විසඳුම් i (J, K) කුඩා වස්තූන් සඳහා වන සියලුම බ්‍රව්සර්වල තරමක් වේගවත් වේ (ෆයර්ෆොක්ස් සඳහා විශාල ඕජෙක්ට් සඳහා වේගවත් නමුත් අනෙක් බ්‍රව්සර් මත මධ්‍යම වේගයෙන්)
  • iterator (D, E) මත පදනම් වූ විසඳුම් මන්දගාමී වන අතර නිර්දේශ නොකරයි
  • ද්‍රාවණය සී විශාල වස්තූන් සඳහා මන්දගාමී වන අතර කුඩා වස්තූන් සඳහා මධ්‍යම-මන්දගාමී වේ

රූප විස්තරය මෙහි ඇතුළත් කරන්න

විස්තර

සඳහා කාර්ය සාධන පරීක්ෂණ සිදු කරන ලදී

  • කුඩා වස්තුව - ක්ෂේත්‍ර 3 ක් සමඟ - ඔබට ඔබේ යන්ත්‍රය මත පරීක්ෂණ සිදු කළ හැකිය මෙතැන
  • 'විශාල' වස්තුව - ක්ෂේත්‍ර 1000 ක් සමඟ - ඔබට ඔබේ යන්ත්‍රය මත පරීක්ෂණ සිදු කළ හැකිය මෙතැන

ස්නිපෙට් වලට පහළින් භාවිතා කළ විසඳුම් ඉදිරිපත් කරයි

ක්‍රෝම් හි කුඩා වස්තු සඳහා ප්‍රති result ල මෙහි ඇත

රූප විස්තරය මෙහි ඇතුළත් කරන්න


8

පරායත්තතාවයකින් තොරව ජාවාස්ක්‍රිප්ට් කේතය පමණි:

var p = {"p1": "value1", "p2": "value2", "p3": "value3"};
keys = Object.keys(p);   // ["p1", "p2", "p3"]

for(i = 0; i < keys.length; i++){
  console.log(keys[i] + "=" + p[keys[i]]);   // p1=value1, p2=value2, p3=value3
}

8

මෙම Object.keys()ක්‍රමය මඟින් ලබා දී ඇති වස්තුවක ගණනය කළ නොහැකි ගුණාංග රාශියක් ලබා දෙයි. ඒ ගැන වැඩි විස්තර මෙතැනින් කියවන්න

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

Object.keys(p).map((key)=> console.log(key + "->" + p[key]))


7

ඔබට සෑම වස්තුවකටම සරල forEach ශ්‍රිතයක් එක් කළ හැකිය , එවිට ඔබට ඕනෑම වස්තුවක් හරහා ස්වයංක්‍රීයව ලූප් කළ හැකිය:

Object.defineProperty(Object.prototype, 'forEach', {
    value: function (func) {
        for (var key in this) {
            if (!this.hasOwnProperty(key)) {
                // skip loop if the property is from prototype
                continue;
            }
            var value = this[key];
            func(key, value);
        }
    },
    enumerable: false
});

" සඳහා ... සඳහා " අකමැති අය සඳහා - ක්‍රමය:

Object.defineProperty(Object.prototype, 'forEach', {
    value: function (func) {
        var arr = Object.keys(this);
        for (var i = 0; i < arr.length; i++) {
            var key = arr[i];
            func(key, this[key]);
        }
    },
    enumerable: false
});

දැන්, ඔබට සරල ඇමතුමක් ලබා ගත හැකිය:

p.forEach (function(key, value){
    console.log ("Key: " + key);
    console.log ("Value: " + value);
});

වෙනත් සෑම ක්‍රමයක් සමඟම ගැටුම් ඇති කර ගැනීමට ඔබට අවශ්‍ය නැතිනම් ඔබට එය ඔබගේ අද්විතීය නමෙන් නම් කළ හැකිය.


3
වස්තූන් තුළ සාදන ලද (වැනි Object) මූලාකෘති වෙනස් කිරීම සාමාන්‍යයෙන් ප්‍රති රටාවක් ලෙස සලකනු ලබන්නේ එය වෙනත් කේත සමඟ පහසුවෙන් ගැටුම් ඇති කළ හැකි බැවිනි. ඒ නිසා තුවාලයක් නැහැ එය මේ ආකාරයෙන් කිරීමෙන් නිර්දේශ කරමු.
මොරිට්ස්

6

පිරිසිදු ජාවාස්ක්‍රිප්ට් භාවිතා කරන විට ලූප ඉතා රසවත් විය හැකිය. ලූප පාලනය කර ඇත්තේ ECMA6 (නව 2015 JavaScript පිරිවිතර) පමණක් බව පෙනේ. අවාසනාවට, මම මෙය ලියන විට, බ්‍රව්සර් සහ ජනප්‍රිය ඒකාබද්ධ සංවර්ධන පරිසරය (IDE) යන දෙකම තවමත් නව සීනු සහ විස්ල් සඳහා පූර්ණ සහය දැක්වීමට අරගල කරමින් සිටී.

බැලූ බැල්මට ECMA6 ට පෙර ජාවාස්ක්‍රිප්ට් වස්තු පුඩුවක් පෙනෙන්නේ කෙසේද:

for (var key in object) {
  if (p.hasOwnProperty(key)) {
    var value = object[key];
    console.log(key); // This is the key;
    console.log(value); // This is the value;
  }
}

එසේම, මෙම ප්‍රශ්නය සමඟ මෙය විෂය පථයෙන් බැහැරව ඇති බව මම දනිමි, නමුත් 2011 දී ECMAScript 5.1 විසින් forEachඅරාව සඳහා වූ ක්‍රමය පමණක් එකතු කරන ලද අතර එය මූලික වශයෙන් අරා හරහා ලූප කිරීම සඳහා නව වැඩිදියුණු කළ ක්‍රමයක් නිර්මාණය කළ අතර පැරණි වාචික හා ව්‍යාකූල forලූප සමඟ නැවත යෙදිය නොහැකි වස්තූන් අතහැර දමයි . නමුත් අමුතුම දෙය නම්, මෙම නව forEachක්‍රමවේදය breakවෙනත් ආකාරයේ ගැටළු වලට තුඩු දුන් සහය නොදක්වන බවයි.

මූලික වශයෙන් 2011 දී, බොහෝ ජනප්‍රිය පුස්තකාල (jQuery, අන්ඩර්ස්කෝර්, ආදිය) නැවත ක්‍රියාත්මක කිරීමට තීරණය කළ දේ හැරුණු විට ජාවාස්ක්‍රිප්ට් තුළ ලූප් කිරීමට සැබෑ ස්ථිර ක්‍රමයක් නොමැත.

2015 වන විට, ඕනෑම වස්තු වර්ගයක් (අරා සහ නූල් ඇතුළුව) ලූප (හා කැඩීමට) වඩා හොඳ ක්‍රමයක් දැන් අපට තිබේ. නිර්දේශය ප්‍රධාන ධාරාව බවට පත්වන විට ජාවාස්ක්‍රිප්ට් හි ලූපයක් අවසානයේ පෙනෙන්නේ මෙන්න:

for (let [key, value] of Object.entries(object)) {
    console.log(key); // This is the key;
    console.log(value); // This is the value;
}

2016 ජුනි 18 වන විට බොහෝ බ්‍රව්සර් ඉහත කේතයට සහය නොදක්වන බව සලකන්න. ක්‍රෝම් හි පවා ඔබට මෙම විශේෂ ධජය ක්‍රියාත්මක වීමට අවශ්‍ය වේ: chrome://flags/#enable-javascript-harmony

මෙය නව ප්‍රමිතිය බවට පත්වන තුරු, පැරණි ක්‍රමය තවමත් භාවිතා කළ හැකි නමුත් ජනප්‍රිය පුස්තකාලවල විකල්ප හෝ මෙම පුස්තකාල කිසිවක් භාවිතා නොකරන අය සඳහා සැහැල්ලු විකල්ප ඇත.


ඔබට මෙම කාර්යයේ ප්‍රබන්ධයක් ලබා දිය හැකිද? මෙන්න මගේ උත්සාහය. jsfiddle.net/abalter/sceeb211
abalter

@abalter කණගාටුයි මගේ කේතයේ යතුරු ලියනයක ඇති බව මට වැටහුණි. මම එය සවි කර ඔබගේ JsFiddle මෙහි යාවත්කාලීන කළෙමි: jsfiddle.net/sceeb211/2
නිකොලස් බුව්‍රෙට්

මම ක්‍රෝම් වල ඉන්නවා Uncaught TypeError: Object.entries is not a function. එය තවමත් ක්‍රෝම් තුළ ක්‍රියාත්මක වී නැද්ද?
abalter

ඒක තමයි. ඔබ සතුව ක්‍රෝම් 51 අනුවාදය ඇති බවත් මගේ සංස්කරණය සහ ජස්ෆිඩල් අදහස් දැක්වීමේදී ධජය සක්‍රීය කර ඇති බවත් සහතික කරගන්න. ඔබ මෙහි විස්තර පරීක්ෂා කර ගත හැක: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
නිකොලායි Bouvrette

කණගාටුයි මට ධජය ගැන එය මඟ හැරුණි. එය තවමත් සම්පූර්ණයෙන් ක්‍රියාත්මක කර නැති අංගයක් බව මට පෙනේ.
abalter

5

මීට පෙර අභ්‍යන්තර ක්‍රම කිහිපයක් හෙළිදරව් කිරීම සඳහා ES6 හි අප සතුව ප්‍රකට සංකේත ඇත, මෙම වස්තුව සඳහා අනුකාරක ක්‍රියා කරන ආකාරය නිර්වචනය කිරීමට ඔබට එය භාවිතා කළ හැකිය:

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3",
    *[Symbol.iterator]() {
        yield *Object.keys(this);
    }
};

[...p] //["p1", "p2", "p3"]

මෙය es6 loop හි ... සඳහා භාවිතා කරන ප්‍රති result ලයම ලබා දෙනු ඇත.

for(var key in p) {
    console.log(key);
}

නමුත් ඔබට දැන් es6 භාවිතා කරන හැකියාවන් දැන ගැනීම වැදගත්ය!


1
අභිරුචි වස්තු අනුකාරකයක් මඟින් අරාවෙහි බිල්ට් අරා ඉරේටරය හඳුන්වන්නේ Object.keys()මතකය මඟින් ජනනය කර වෙන් කර ඇති ... සිසිල්!
ooo

5

obj.hasOwnerPropertyසෑම for ... inලූපයක් තුළම පරීක්ෂා කරනවාට වඩා මම මෙය කරන්නෙමි .

var obj = {a : 1};
for(var key in obj){
    //obj.hasOwnProperty(key) is not needed.
    console.log(key);
}
//then check if anybody has messed the native object. Put this code at the end of the page.
for(var key in Object){
    throw new Error("Please don't extend the native object");
}

5

    var p =[{"username":"ordermanageadmin","user_id":"2","resource_id":"Magento_Sales::actions"},
{"username":"ordermanageadmin_1","user_id":"3","resource_id":"Magento_Sales::actions"}]
for(var value in p) {
    for (var key in value) {
        if (p.hasOwnProperty(key)) {
            console.log(key + " -> " + p[key]);
        }
    }
}


json = [{"key1":"value1","key2":"value2"},{"key1":"value3","key2":"value4"}] for (var i = 0; i < json.length; i++) { for (var key in json[i]) { if (json[i].hasOwnProperty(key)) { console.log(key + " -> " + json[i][key]); } } }
මාරෙක් බර්නාඩ්

5

for-ofඔන් භාවිතා කිරීමObject.keys()

මෙන්:

let object = {
   "key1": "value1"
   "key2": "value2"
   "key3": "value3"
};

for (var key of Object.keys(p)) {
   console.log(key + " : " + object[key])
}

4

ඔබට ගණනය කළ නොහැකි ගුණාංගObject.getOwnPropertyNames(obj)නැවත සැකසීමට අවශ්‍ය නම්, දී ඇති වස්තුවක් මත කෙලින්ම හමු වූ සියලු ගුණාංග (ගණන් කළ නොහැකි හෝ නැති) ආපසු ලබා දීමට ඔබට භාවිතා කළ හැකිය .

var obj = Object.create({}, {
  // non-enumerable property
  getFoo: {
    value: function() { return this.foo; },
    enumerable: false
  }
});

obj.foo = 1; // enumerable property

Object.getOwnPropertyNames(obj).forEach(function (name) {
  document.write(name + ': ' + obj[name] + '<br/>');
});


2
මෙය අපූරු ය, මෙම පිළිතුර පළ කිරීම ගැන ස්තූතියි. මට Errorවස්තුවක් ගැන ස්වයං විග්‍රහයක් කිරීමට අවශ්‍ය වූ අතර, ලූපයක හෝ _.forIn(err)ඇමතුමක ඇති ගුණාංග ලබා ගැනීමට නොහැකි විය . භාවිතා කරමින් Object.getOwnPropertyNames(err)මට සියලු කොටස් වෙත ප්රවේශ වීමට ඉඩ Errorමම මීට පෙර දී ලබා ගත නොහැකි බව. ස්තූතියි!
පියර්ස්

4

ඕනෑම කෙනෙකුට කොන්දේසියක් සහිතව අරාව වස්තු හරහා ලූප කිරීමට අවශ්‍ය නම් :

var arrayObjects = [{"building":"A", "status":"good"},{"building":"B","status":"horrible"}];

for (var i=0; i< arrayObjects.length; i++) {
  console.log(arrayObjects[i]);
  
  for(key in arrayObjects[i]) {      
    
      if (key == "status" && arrayObjects[i][key] == "good") {
        
          console.log(key + "->" + arrayObjects[i][key]);
      }else{
          console.log("nothing found");
      }
   }
}


4

ES6 සලකා බැලීමේදී මම කැමතියි මගේම සීනි හැන්දක් එකතු කර වස්තුවේ ගුණාංග නැවත කියවීමට තවත් එක් ප්‍රවේශයක් ලබා දීමට.

සරල JS වස්තුව නැති නිසයි iterable කොටුව හුදෙක් අතර, අප භාවිතා කිරීමට නොහැකි for..ofඅතර එහි අන්තර්ගතය වැඩි එල්ලාවල මහතා සඳහා පුඩුවක්. නමුත් කිසිවෙකුට අප නතර කළ හැකි එය කිරීමට iterable .

අපිට bookවස්තුවක් තිබේ.

let book = {
  title: "Amazing book",
  author: "Me",
  pages: 3
}

book[Symbol.iterator] = function(){

  let properties = Object.keys(this); // returns an array with property names
  let counter = 0;
  let isDone = false;

  let next = () => {
    if(counter >= properties.length){
      isDone = true;
    }
    return { done: isDone, value: this[properties[counter++]] }
  }

  return { next };
}

අප එය සාදා ඇති බැවින් අපට එය මේ ආකාරයෙන් භාවිතා කළ හැකිය:

for(let pValue of book){
  console.log(pValue);
}
------------------------
Amazing book
Me
3

නැතහොත් ඔබ ES6 උත්පාදක යන්ත්‍රවල බලය දන්නේ නම්, ඔබට නිසැකවම ඉහත කේතය වඩා කෙටි කළ හැකිය.

book[Symbol.iterator] = function *(){

  let properties = Object.keys(this);
  for (let p of properties){
    yield this[p];
  }

}

වග බලා ගන්න, ඔබ කරමින් සමග සියළුම වස්තූන් සඳහා එම හැසිරීම ඉල්ලුම් කළ හැකි Objectමත iterable prototypeමට්ටම.

Object.prototype[Symbol.iterator] = function() {...}

එසේම, නැවත සැකසිය හැකි ප්‍රොටෝකෝලය සමඟ අනුකූල වන වස්තූන් නව ES2015 විශේෂාංග පැතිරීමේ ක්‍රියාකරු සමඟ භාවිතා කළ හැකි අතර එමඟින් අපට වස්තු දේපල අගයන් අරාවක් ලෙස කියවිය හැකිය.

let pValues = [...book];
console.log(pValues);
-------------------------
["Amazing book", "Me", 3]

නැතහොත් ඔබට විනාශකාරී පැවරුම භාවිතා කළ හැකිය :

let [title, , pages] = book; // notice that we can just skip unnecessary values
console.log(title);
console.log(pages);
------------------
Amazing book
3

මා ඉහත දක්වා ඇති සියලුම කේත සමඟ ඔබට JSFiddle පරීක්ෂා කළ හැකිය .


කේතය මඟින් අගයන් ජනනය කරන නමුත් යතුරු නොමැතිව බව මට පෙනී ගියේය. යතුරු සමඟ අගයන් නැවත සැකසිය හැකිද?
පිකා

ඔව් ඔබට පුළුවන්. ආපසු "අස්වැන්න [යතුර, වස්තුව [යතුර]];" ඔබේ උත්පාදක
ශ්‍රිතයෙන්

4

ES06 සිට ඔබට වස්තුවක අගයන් අරාව ලෙස ලබා ගත හැකිය

let arrValues = Object.values( yourObject) ;

එය වස්තු අගයන්ගේ පෙළක් ලබා දෙන අතර එය මූලාකෘති වලින් අගයන් උකහා නොගනී !!

MDN DOCS Object.values ​​()

සහ යතුරු සඳහා (සියල්ලටම පෙර මා ඉදිරියේ පිළිතුරු දී ඇත)

let arrKeys   = Object.keys(yourObject);

පිළිතුරු යතුරු සහ අගයන් යන දෙකම ලබා දෙන විසඳුමක් ඉල්ලා සිටී.
ෂෝන් ලින්ඩෝ

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.