I have an object. I would like to modify the object (not clone it) by removing all properties except for certain specific properties. For instance, if I started with this o
You could use delete :
for (var k in myObj) {
if (k !== 'p1' && k !== 'p2' && k !== 'p100') {
delete myObj[k];
}
}
An alternative to indexOf :
var keep = /^p(1|2|100)$/;
for (var k in myObj) {
if (!keep.test(k)) {
delete myObj[k];
}
}
Shorter :
var keep = /^p(1|2|100)$/;
for (var k in myObj) {
keep.test(k) || delete myObj[k];
}
Array to RegExp :
var keep = [1, 2, 100];
keep = new RegExp('^p(' + keep.join('|') + ')$'); // /^p(1|2|100)$/
keep.test('p1'); // true
keep.test('p3'); // false
Useful with a function :
function keep(o, ids) {
var keep = new RegExp('^p(' + ids.join('|') + ')$');
for (var k in o) keep.test(k) || delete o[k];
return o;
}
Usage :
keep(myObj, [1, 2, 100]); // { p1: 123, p2: 321, p100: 3434 }
You don't like regular expressions but still want a bullet proof solution :
function keep(o, keys) {
for (var k in o) contains(keys, k) || delete o[k];
return o;
}
function contains(array, value) {
var i = -1, l = array.length;
while (++i < l) if (array[i] === value) return true;
return false;
}
function prefix(array, prefix) {
var i = -1, l = array.length, output = [];
while (++i < l) output.push(prefix + array[i]);
return output;
}
Usage :
keep(myObj, ['p1', 'p2', 'p100']);
// with a middleman :
var idsToKeep = [1, 2, 100];
keep(myObj, prefix(idsToKeep, 'p'));
Well, I could go on like this infinitely, but it's time to eat.