Vra

Ek weet in javascript voorwerpe dubbel as hashes maar ek het nie in staat is om uit te vind 'n ingeboude in funksie om die sleutels te kry

var h = {a:'b',c:'d'};

Ek wil iets soos

var k = h.keys() ; // k = ['a','c'];

Dit is maklik om 'n funksie myself te herhaal oor die items en voeg die sleutels om 'n skikking wat ek terugkeer skryf, maar daar is 'n standaard skoner manier om dit te doen?

Ek hou voel dit moet 'n eenvoudige gebou in funksie wat ek gemis het, maar ek kan dit nie vind nie!

Was dit nuttig?

Oplossing

Daar is funksie in die moderne JavaScript (ECMAScript 5) genoem Object.keys uitvoering van hierdie operasie:

var obj = { "a" : 1, "b" : 2, "c" : 3};
alert(Object.keys(obj)); // will output ["a", "b", "c"]

Verenigbaarheid besonderhede kan hier gevind .

Op die Mozilla webwerf daar is ook 'n uittreksel vir backward compatibility:

if(!Object.keys) Object.keys = function(o){
   if (o !== Object(o))
      throw new TypeError('Object.keys called on non-object');
   var ret=[],p;
   for(p in o) if(Object.prototype.hasOwnProperty.call(o,p)) ret.push(p);
   return ret;
}

Ander wenke

Vir produksie-kode wat 'n groot verenigbaarheid met kliënt blaaier Ek stel nog antwoord Ivan Nevostruev se bo met shim om Object.keys verseker in ouer blaaiers. Dit is egter moontlik om die presiese funksie versoek met behulp van ECMA se nuwe defineProperty funksie kry.

As van ECMAScript 5 - Object.defineProperty

As van ECMA5 jy kan gebruik Object.defineProperty() om nie-enumerable eienskappe definieer. Die huidige verenigbaarheid nog het veel te wense oor, maar dit moet uiteindelik bruikbare in alle blaaiers word. (Let veral op die huidige onverenigbaarheid met IE8!)

Object.defineProperty(Object.prototype, 'keys', {
  value: function keys() {
    var keys = [];
    for(var i in this) if (this.hasOwnProperty(i)) {
      keys.push(i);
    }
    return keys;
  },
  enumerable: false
});

var o = {
    'a': 1,
    'b': 2
}

for (var k in o) {
    console.log(k, o[k])
}

console.log(o.keys())

# OUTPUT
# > a 1
# > b 2
# > ["a", "b"]

Maar sedert ECMA5 reeds Object.keys bygevoeg jy kan net so goed gebruik:

Object.defineProperty(Object.prototype, 'keys', {
  value: function keys() {
    return Object.keys(this);
  },
  enumerable: false
});

Original antwoord

Object.prototype.keys = function ()
{
  var keys = [];
  for(var i in this) if (this.hasOwnProperty(i))
  {
    keys.push(i);
  }
  return keys;
}

Edit: Aangesien hierdie antwoord vir 'n rukkie was ek die bogenoemde onaangeraak laat. Enigiemand lees dit moet ook lees Ivan Nevostruev se antwoord hieronder.

Daar is geen manier om prototipe funksies nie-enumerable wat lei tot hulle altyd draai in vir-in sirkelroetes wat nie gebruik hasOwnProperty. Ek dink nog steeds hierdie antwoord sou ideaal wees as die uitbreiding van die prototipe van Object was nie so morsig.

jy kan gebruik Object.keys

Object.keys(h)

Jy kan gebruik Underscore.js , wat is 'n Javascript nut biblioteek.

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

Dit is die beste wat jy kan doen, sover ek weet ...

var keys = [];
for (var k in h)keys.push(k);

jQuery jy kan die sleutels soos hierdie te kry:

var bobject =  {primary:"red",bg:"maroon",hilite:"green"};
var keys = [];
$.each(bobject, function(key,val){ keys.push(key); });
console.log(keys); // ["primary", "bg", "hilite"]

Of:

var bobject =  {primary:"red",bg:"maroon",hilite:"green"};
$.map(bobject, function(v,k){return k;});

danksy @pimlottc

Ek glo jy kan loop deur die eienskappe van die voorwerp deur gebruik te maak vir / in, sodat jy iets kon doen:

function getKeys(h) {
  Array keys = new Array();
  for (var key in h)
    keys.push(key);
  return keys;
}

Ek wou die top rated antwoord hierbo

gebruik
Object.prototype.keys = function () ...

Maar wanneer die gebruik van in samewerking met die Google Maps API v3, Google Maps nie-funksionele.

for (var key in h) ...

werk goed.

As jy probeer om net die elemente te kry, maar nie die funksies dan hierdie kode kan jy help

this.getKeys = function() {

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

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

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

}

Dit is deel van my implementering van die HashMap en ek wil net die sleutels, this is die hashmap voorwerp wat die sleutels bevat

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top