Hoe om sleutels van 'n gemors te vind?
-
09-06-2019 - |
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!
Oplossing
Daar is funksie in die moderne JavaScript (ECMAScript 5) genoem Object.keys
'n> 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()
'n> 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
gebruikObject.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