Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
194
rated 0 times [  197] [ 3]  / answers: 1 / hits: 84465  / 13 Years ago, fri, july 8, 2011, 12:00:00

I wrote the following code to pop a property from an object as if it were an array. This looks like the kind of code that would get me slapped by more serious programmers, so I was wondering what is the proper way to do this:



// wrong way to pop:
for( key in profiles ){
var profile = profiles[key]; // get first property
profiles[key] = 0; // Save over property just in case delete actually deletes the property contents instead of just removing it from the object
delete profiles[key]; // remove the property from the object
break; // break because this is a loop
}


I should have mentioned above, that unlike a true pop, I don't need the objects to come out in any particular order. I just need to get one out and remove it from its parent object.


More From » object

 Answers
64
for( key in profiles ){


You should really declare key as a var.



profiles[key] = 0;            // Save over property just in case delete actually deletes the property contents instead of just removing it from the object


is unnecessary. Delete doesn't touch the value of the property (or in the case of a property that has a setter but no getter, even require that it have a value).



If the object has any enumerable properties on its prototype, then this will do something odd.
Consider



Object.prototype.foo = 42;

function take(obj) {
for (var key in obj) {
// Uncomment below to fix prototype problem.
// if (!Object.hasOwnProperty.call(obj, key)) continue;
var result = obj[key];
// If the property can't be deleted fail with an error.
if (!delete obj[key]) { throw new Error(); }
return result;
}
}

var o = {};
alert(take(o)); // alerts 42
alert(take(o)); // still alerts 42

[#91283] Thursday, July 7, 2011, 13 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
acaciac

Total Points: 317
Total Questions: 117
Total Answers: 128

Location: France
Member since Thu, Oct 27, 2022
2 Years ago
;