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


850

මම මෙසේ වස්තුවක් නිර්මාණය කළ බව පවසන්න:

var myObject =
        {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

දේපල නම් ලැයිස්තුවක් ලබා ගැනීමට හොඳම ක්‍රමය කුමක්ද? එනම් විචල්ය යතුරු කිහිපයක් සමඟ අවසන් කිරීමට මම කැමතියි:

keys == ["ircEvent", "method", "regex"]

3
ටිකක් මාතෘකාවක්, නමුත් ඔබ underscore.js භාවිතා කරන්නේ නම්:_.keys(myJSONObject)
එන්ඩි ටජ්ජොනෝ

TL; DR: ඔබට ගණන් කළ හැකි දේපල පමණක් අවශ්‍ය නම්: Object.keys(obj)සමහර විට ඔබට ගණන් කළ නොහැකි ගුණාංගද අවශ්‍ය වේ. ඔබ එසේ කරන්නේ නම් මෙය මතක තබා ගැනීමට වග බලා ගන්න! ඔවුන් ලබා ගැනීම සඳහා, භාවිත Object.getOwnPropertyNames(obj) stackoverflow.com/a/32413145/1599699
ඇන්ඩෲ

Answers:


1089

නවීන බ්‍රව්සර් වලදී (IE9 +, FF4 +, Chrome5 +, Opera12 +, Safari5 +) ඔබට ගොඩනගා ඇති Object.keys ක්‍රමය භාවිතා කළ හැකිය :

var keys = Object.keys(myObject);

ඉහත සම්පූර්ණ පොලිෆිල් එකක් ඇති නමුත් සරල කළ අනුවාදයක් නම්:

var getKeys = function(obj){
   var keys = [];
   for(var key in obj){
      keys.push(key);
   }
   return keys;
}

විකල්පයක් ලෙස වෙනුවට var getKeysසමග Object.prototype.keysඔබ කතා කිරීමට ඉඩ .keys()ඕනෑම වස්තුවක් මත. මූලාකෘතිය දීර් ing කිරීමෙන් අතුරු ආබාධ ඇති අතර එය සිදු කිරීම මම නිර්දේශ නොකරමි.


18
'ඔබ මූලාකෘතිවලට විරුද්ධ වීමට මෙය කිරීමට පෙළඹෙනු ඇත ... නමුත් එසේ නොකරන්න!'
ඇන්තනි ඩබ්ලිව් ජෝන්ස්

4
යමෙකුට ආලෝකය විහිදුවාලීමට අවශ්‍ය නම්, වස්තුවේ මූලාකෘතියට ශ්‍රිත එකතු කිරීම නිර්දේශ නොකරන්නේ ඇයි?
විශ්වනාත්

2
එය මුළුමනින්ම වෙනස් ප්‍රශ්නයකි, මෙහි ඉක්මන් සෙවීමක් ස්ටක් ඕවර් ප්‍රවාහයේ හෝ ගූගල් හි ඔබට කියවීමට බොහෝ දේ ලබා දෙනු ඇත
ximi

3
for (var key in myObject) {...}බ්‍රව්සර් සහ V8 වලින් පිටත ජාවාස්ක්‍රිප්ට් ධාවන වේලාවන් සඳහා මෙම තාක්ෂණය ප්‍රයෝජනවත් වේ. උදාහරණයක් ලෙස, ජාවාස්ක්‍රිප්ට් සිතියම පසු කරන විට-රියාක් වෙත විමසුම් අඩු කරන්න Objectවස්තුව නොපවතින බැවින් Object.keysක්‍රමය නොමැත.
ekillaby

20
laslashnick ඔබේ “සරල කළ අනුවාදය” මඟින් වස්තුවේ මූලාකෘති දාමයේ ඇති සියලුම ගුණාංග නැවත ලබා දෙයි (එය “for ... in” භාවිතා කරන බැවින්), (ECMAScript 5.1) Object.keysක්‍රමය මඟින් වස්තුවේ ගුණාංග පමණක් ලබා දෙයි. මම එය වැදගත් වෙනසක් ලෙස දකිමි.
මාටින් කැරල්

259

ලෙස slashnick පෙන්වා, ඔබ එහි විශේෂණය නම් සඳහා වස්තුවක් කෙරෙහි වඩාත් කැපීපෙනේ කිරීමට ඉදිකිරීමක් "තුළ සඳහා" භාවිතා කළ හැක. කෙසේ වෙතත් ඔබ වස්තුවේ මූලාකෘති දාමයේ ඇති සියලුම ගුණාංග නාමයන් නැවත කියනු ඇත. ඔබට වස්තුවේ ගුණාංග මත පමණක් නැවත යෙදීමට අවශ්‍ය නම් , ඔබට වස්තුව # hasOwnProperty () ක්‍රමය භාවිතා කළ හැකිය. මේ අනුව පහත සඳහන් දේ ඇත.

for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        /* useful code here */
    }
}

26
ස්ලෑෂ්නික්ගේ පිළිතුරට පෙර මා මෙය කියවා ඇතැයි සිතමි. මට escයතුර තදින් අල්ලාගෙන විනාඩි 15 ක් ගත කිරීමට සිදුවිය, මන්ද එම වස්තුවට දේපළ මිලියනයක් පමණ ඇති අතර, ඒවායින් බොහොමයක් භාවිතා නොකළ අතර ඒ පිළිබඳව මට අනතුරු ඇඟවීමක් තිබුණි.
මාර්ක් හෙන්ඩර්සන්


4
LOL ark මාක්හෙන්ඩර්සන් - නමුත් ඊළඟ වතාවේ, බ්‍රව්සරයේ ක්‍රියාවලිය විනාශ කර විනාඩි 15 ක් නාස්ති කරනවා වෙනුවට එය නැවත ආරම්භ කරන්න :)
ජේ. ඩී. ස්මිත්

- මේ හා සම්බන්ධ කාර්යය obj.getOwnPropertyNames () යනු developer.mozilla.org/en-US/docs/JavaScript/Reference/...
ස්ටීව් ගුඩ්මන්

Ark මාක්හෙන්ඩර්සන් ඔබ console.log භාවිතා නොකරන්නේ ඇයි?
LasagnaAndroid

102

සෑම් ඩටන් පිළිතුරු දුන් පරිදි, මේ සඳහාම නව ක්‍රමයක් ECMAScript 5 වන සංස්කරණයේ හඳුන්වා දී ඇත. Object.keys()ඔබට අවශ්‍ය දේ කරනු ඇති අතර එය ෆයර්ෆොක්ස් 4 , ක්‍රෝම් 6, සෆාරි 5 සහ අයිඊ 9 හි සහය දක්වයි .

ඔබට සහාය නොදක්වන බ්‍රව්සර් තුළද මෙම ක්‍රමය ඉතා පහසුවෙන් ක්‍රියාත්මක කළ හැකිය. කෙසේ වෙතත්, එහි ක්‍රියාත්මක කිරීම් සමහරක් ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් සමඟ සම්පුර්ණයෙන්ම අනුකූල නොවේ. මෙන්න වඩාත් අනුකූල විසඳුමක්:

Object.keys = Object.keys || (function () {
    var hasOwnProperty = Object.prototype.hasOwnProperty,
        hasDontEnumBug = !{toString:null}.propertyIsEnumerable("toString"),
        DontEnums = [ 
            'toString', 'toLocaleString', 'valueOf', 'hasOwnProperty',
            'isPrototypeOf', 'propertyIsEnumerable', 'constructor'
        ],
        DontEnumsLength = DontEnums.length;

    return function (o) {
        if (typeof o != "object" && typeof o != "function" || o === null)
            throw new TypeError("Object.keys called on a non-object");

        var result = [];
        for (var name in o) {
            if (hasOwnProperty.call(o, name))
                result.push(name);
        }

        if (hasDontEnumBug) {
            for (var i = 0; i < DontEnumsLength; i++) {
                if (hasOwnProperty.call(o, DontEnums[i]))
                    result.push(DontEnums[i]);
            }   
        }

        return result;
    };
})();

දැනට පිළිගත් පිළිතුරට hasOwnProperty () සඳහා චෙක්පතක් ඇතුළත් නොවන අතර මූලාකෘති දාමය හරහා උරුම වූ දේපල නැවත ලබා දෙන බව සලකන්න . ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් හි සුප්‍රසිද්ධ ඩොන්ට්එනම් දෝෂය සඳහා ද එය හේතු නොවේ, එහිදී මූලාකෘති දාමයේ ගණන් කළ නොහැකි ගුණාංග දේශීයව ප්‍රකාශයට පත් කරන ලද දේපල එකම නමක් සහිත ඩොන්ට්එනම් ගුණාංගයට උරුම වීමට හේතු වේ.

Object.keys () ක්‍රියාත්මක කිරීමෙන් ඔබට වඩාත් ශක්තිමත් විසඳුමක් ලැබෙනු ඇත.

සංස්කරණය කරන්න: මූලාකෘති සඳහා සුප්‍රසිද්ධ දායකයෙකු වන කැන්ගක්ස් සමඟ මෑතකදී කළ සාකච්ඡාවකින් පසුව , ඩොන්ට්එනම් දෝෂය සඳහා වන Object.forIn()ක්‍රියාකාරිත්වය මෙහි ඇති කේතයේ කේතය මත පදනම්ව ක්‍රියාත්මක කළෙමි .


විශිෂ් answer පිළිතුර, මම සිතන්නේ පිළිගත් පිළිතුර වඩාත්ම ක්‍රියාකාරී නිවැරදි විසඳුම ලෙස පවතින අතර එය සැමවිටම JSON ආ .ාවක් යැයි උපකල්පනය කරමි. මෙය නිසැකවම වෙනත් තැනක භාවිතා කළ යුතුය.
ඩේවිඩ් ස්නබෙල්-කව්න්ට්

1
Av ඩේවිඩ් කව්න්ට්: ස්තූතියි :-) අවාසනාවකට මෙන්, පිළිගත් පිළිතුර තවමත් ඩොන්ට්එනම් දෝෂය අසාර්ථක වනු ඇති අතර JSON වස්තුවට එහි එක් යතුරක් ලෙස “අගය ඕෆ්” හෝ “කන්ස්ට්‍රක්ටර්” වැනි නූලක් තිබිය හැකි බව ඔබ දන්නේ නැත. එය දිගු කිරීම හරහා නැවත කියනු ඇත Object.prototype. බොහෝ විට සිදුවන්නේ කෙටි කේතය විශාල, වඩා ශක්තිමත් කේත වලට වඩා සැලකිය යුතු ලෙස ආකර්ෂණීය පෙනුමක් ඇති නමුත් මෙම පිළිතුරේ හරය වන්නේ ECMAScript 5 භාවිතා කිරීමයි Object.keys(), එය මෙම කේතය භාවිතයෙන් සහාය නොදක්වන බ්‍රව්සර් තුළ ක්‍රියාත්මක කළ හැකිය. ස්වදේශීය අනුවාදය මීට වඩා ක්‍රියාකාරී වනු ඇත.
ඇන්ඩි ඊ

2
හරිම හොඳයි, ඇන්ඩි :) මම මතක් කිරීමට කැමතියි - මෙම ත්‍රෙඩ් එකේ කිසිවෙකු සඳහන් කර නැති බව - ES5 මඟින් වස්තුවක ගණන් කළ නොහැකි ගුණාංගවලට Object.keysඅනුරූප වන නූල් සමූහයක් පමණක් ලබා දෙන බව . ස්වදේශීය (පරිශීලක-නිර්වචනය කරන ලද) වස්තූන් සමඟ වැඩ කිරීමේදී මෙය තීරණාත්මක නොවනු ඇත, නමුත් ධාරක වස්තූන් සමඟ එය බොහෝ සෙයින් දැකිය යුතුය (නිශ්චිතව දක්වා නැති ධාරක වස්තු හැසිරීම වෙනම - වේදනාකාරී - කතාවක් වුවද). සියළුම (ගණනය කළ නොහැකි) ගුණාංග ගණනය කිරීම සඳහා, ES5 සපයයි (මගේ සංයුක්ත වගුවේ එහි සහාය බලන්න. Kangax.github.com/es5-compat-table )Object.getOwnPropertyNames
කැන්ගක්ස්


2
මෙය ක්‍රියාත්මක කරන්නේ ඇයි Object.keys(stuff)සහ stuff.keys()නැතිද යන්න යමෙකුට පැහැදිලි කළ හැකිද ?
බ්ලේස්මොන්ගර්

33

Object.keys සහ අනෙකුත් ECMAScript 5 ක්‍රම සඳහා ෆයර්ෆොක්ස් 4, ක්‍රෝම් 6, සෆාරි 5, අයිඊ 9 සහ ඊට ඉහළින් සහාය දක්වන බව සලකන්න.

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

var o = {"foo": 1, "bar": 2}; 
alert(Object.keys(o));

ECMAScript 5 අනුකූලතා වගුව: http://kangax.github.com/es5-compat-table/

නව ක්‍රම පිළිබඳ විස්තරය: http://markcaudill.com/index.php/2009/04/javascript-new-features-ecma5/


ක්‍රෝම් දේව් මෙවලම්, ෆයර්බග් යනාදිය සඳහා කොන්සෝලයේ යතුරු () ද පරීක්ෂා කරන්න
සෑම් ඩටන්


28

Object.getOwnPropertyNames(obj)

මෙම ශ්‍රිතය මඟින් පෙන්වන ලද ඒවාට අමතරව ගණන් කළ නොහැකි ගුණාංග ද පෙන්වයි Object.keys(obj).

JS හි, සෑම දේපලකටම බූලියන් ඇතුළු දේපල කිහිපයක් තිබේ enumerable.

පොදුවේ ගත් කල, ගණනය කළ නොහැකි ගුණාංග වඩාත් "අභ්‍යන්තර" වන අතර අඩු වාර ගණනක් භාවිතා වේ, නමුත් ඇත්ත වශයෙන්ම සිදුවන්නේ කුමක්ද යන්න බැලීමට සමහර විට ඒවා සොයා බැලීම බුද්ධිමත් ය.

උදාහරණයක්:

var o = Object.create({base:0})
Object.defineProperty(o, 'yes', {enumerable: true})
Object.defineProperty(o, 'not', {enumerable: false})

console.log(Object.getOwnPropertyNames(o))
// [ 'yes', 'not' ]

console.log(Object.keys(o))
// [ 'yes' ]

for (var x in o)
    console.log(x)
// yes, base

කෙසේද යන්නත් සටහන් කරන්න:

  • Object.getOwnPropertyNamesහා Object.keys නෑ සොයා ගැනීමට පතිරූපක දාම යන්නbase
  • for in කරයි

මෙහි ඇති මූලාකෘති දාමය පිළිබඳ වැඩි විස්තර: https://stackoverflow.com/a/23877420/895245


17

මම ඩම්ප් ශ්‍රිතයේ විශාල රසිකයෙක්.

http://ajaxian.com/archives/javascript-variable-dump-in-coldfusion alt පෙළ


1
+1 මක් නිසාද යත් මා මෙහි පැමිණියේ සමාන දෙයක් තැනීමේ අදහසින් (එතරම් හොඳ නොවුනත්).
කැමිලෝ මාටින්

1
netgrow.com.au/assets/files/dump/dump.zip හමු නොවීය මම ඩම්ප් ජාවාස්ක්‍රිප්ට් බාගත කරන්නේ කෙසේද?
කික්නෙට්

@Kiquenet මම නිත්ය වස්තුව පරීක්ෂක සඳහා මම මේ පදිංචි වැනි ගොඩ නැඟීමට දෙයක් කිරීමට අවශ්ය වන සෑම අවස්ථාවකදීම, ඔබ HTML හි ඉටුකල අවශ්ය නම් තියෙනවා වගේ දේවල් npm මොඩියුල . අවංකවම මා හිර වී ඇත්තේ මට එම රූපයේ ඇති දේට වඩා හොඳ යමක් අවශ්‍ය නමුත් එය කිසි විටෙකත් සංකල්පගත කිරීමට නොහැකි විය. පරීක්ෂක තුළ ඇති වස්තු පිරික්සීමට ලැජ්ජා සහගත නමුත් අත්තනෝමතික වස්තූන්ගෙන් අර්ථය අඩු කිරීමට උත්සාහ කිරීම (උදා: වස්තූන්ගේ අරා තීරු සහිත වගු වලට වර්ග කිරීම) සෑම විටම ප්‍රායෝගිකව ක්‍රියාත්මක නොවේ.
කැමිලෝ මාටින්

1
ලස්සන මුද්‍රණ ජාවාස්ක්‍රිප්ට් ගැන කුමක් කිව https://j11y.io/demos/prettyprint/හැකිද?
කික්නෙට්

13

පහත පරිදි jQuery සමඟ එය කළ හැකිය:

var objectKeys = $.map(object, function(value, key) {
  return key;
});

9

ඔබ මූලද්‍රව්‍ය පමණක් ලබා ගැනීමට උත්සාහ කරන නමුත් කාර්යයන් නොවේ නම් මෙම කේතය ඔබට උදව් වනු ඇත

this.getKeys = function() {

    var keys = new Array();
    for(var key in this) {

        if( typeof this[key] !== 'function') {

            keys.push(key);
        }
    }
    return keys;
}

මෙය මම හැෂ්මැප් ක්‍රියාත්මක කිරීමේ කොටසක් වන අතර මට අවශ්‍ය වන්නේ යතුරු පමණි, "මෙය" යනු යතුරු අඩංගු හැෂ්මැප් වස්තුවයි


8

IE8 හි පවා බොහෝ බ්‍රව්සර් වල මෙය ක්‍රියාත්මක වන අතර කිසිදු ආකාරයක පුස්තකාල අවශ්‍ය නොවේ. var i ඔබේ යතුරයි.

var myJSONObject =  {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"}; 
var keys=[];
for (var i in myJSONObject ) { keys.push(i); }
alert(keys);

2
ඔබගේ පිළිතුර දැනටමත් පළ කර ඇති ඒවාට සමාන බව පෙනේ, තවත් යමක් එකතු කළ යුතුද?
VKen


7

එය සහාය නොදක්වන බ්‍රව්සරයක එය කරන්නේ කෙසේද යන්න පිළිබඳ සම්පූර්ණ ක්‍රියාත්මක කිරීමේ තොරතුරු මොසිල්ලා සතුව ඇත .

if (!Object.keys) {
  Object.keys = (function () {
    var hasOwnProperty = Object.prototype.hasOwnProperty,
        hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
        dontEnums = [
          'toString',
          'toLocaleString',
          'valueOf',
          'hasOwnProperty',
          'isPrototypeOf',
          'propertyIsEnumerable',
          'constructor'
        ],
        dontEnumsLength = dontEnums.length;

    return function (obj) {
      if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');

      var result = [];

      for (var prop in obj) {
        if (hasOwnProperty.call(obj, prop)) result.push(prop);
      }

      if (hasDontEnumBug) {
        for (var i=0; i < dontEnumsLength; i++) {
          if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
        }
      }
      return result;
    };
  })();
}

ඔබ කැමති ආකාරයට එය ඇතුළත් කළ හැකිය, නමුත් සමහර විට extensions.jsඔබේ ස්ක්‍රිප්ට් තොගයේ ඉහළින් ඇති කිසියම් ගොනුවක.


එම්ඩීඑන් ක්‍රියාත්මක කිරීම පදනම් වී ඇත්තේ ඇන්ඩි ඊ ගේ ය.
outis

5

භාවිත Reflect.ownKeys()

var obj = {a: 1, b: 2, c: 3};
Reflect.ownKeys(obj) // ["a", "b", "c"]

Object.keys හා Object.getOwnPropertyNames ලබා ගැනීමට නොහැකි -ගණ්ය නොවන ගුණ. ගණනය කළ නොහැකි දේපල සඳහා පවා එය ක්‍රියා කරයි.

var obj = {a: 1, b: 2, c: 3};
obj[Symbol()] = 4;
Reflect.ownKeys(obj) // ["a", "b", "c", Symbol()]

4

දේශීය දේපල සඳහා IE (i obj) සඳහා සහය නොදක්වයි. මෙන්න මට සොයා ගත හැකි සියලුම මුක්කු ලැයිස්තුවක්.

ස්ටැක් ඕවර් ප්‍රවාහය මෝඩ පෙරනයක් කරන බව පෙනේ.

මෙම ගූගල් කණ්ඩායම් පෝස්ටයේ පහළින් ලැයිස්තුව ලබා ගත හැකිය: - https://groups.google.com/group/hackvertor/browse_thread/thread/a9ba81ca642a63e0


4

සෑම ව්‍යාපෘතියකම පාහේ මම underscore.js භාවිතා කරන බැවින්, මම keysශ්‍රිතය භාවිතා කරමි :

var obj = {name: 'gach', hello: 'world'};
console.log(_.keys(obj));

එහි ප්‍රතිදානය වනුයේ:

['name', 'hello']

එය බොහෝ විට භාවිතා කරන ජාවාස්ක්‍රිප්ට් ක්‍රියාකාරිත්වය සඳහා වූ මෙවලම් කට්ටල පුස්තකාලයකි: underscorejs.org
schmijos

4

පිළිගත් පිළිතුර මත ගොඩනැගීම.

වස්තුවට ගුණාංග තිබේ නම් ඔබට අමතන්න .Properties () උත්සාහ කරන්න!

var keys = Object.keys(myJSONObject);

for (var j=0; j < keys.length; j++) {
  Object[keys[j]].properties();
}

0

විසඳුම මගේ නඩු සහ හරස් බ්‍රව්සරය මත ක්‍රියා කරයි:

var getKeys = function(obj) {
    var type = typeof  obj;
    var isObjectType = type === 'function' || type === 'object' || !!obj;

    // 1
    if(isObjectType) {
        return Object.keys(obj);
    }

    // 2
    var keys = [];
    for(var i in obj) {
        if(obj.hasOwnProperty(i)) {
            keys.push(i)
        }
    }
    if(keys.length) {
        return keys;
    }

    // 3 - bug for ie9 <
    var hasEnumbug = !{toString: null}.propertyIsEnumerable('toString');
    if(hasEnumbug) {
        var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
            'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];

        var nonEnumIdx = nonEnumerableProps.length;

        while (nonEnumIdx--) {
            var prop = nonEnumerableProps[nonEnumIdx];
            if (Object.prototype.hasOwnProperty.call(obj, prop)) {
                keys.push(prop);
            }
        }

    }

    return keys;
};
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.