I am trying to get all the keys and values of an object that begin with imageIds
.
My object appears as the following:
{
title: 'fsdfsd',
titleZh: 'fsdfsd',
body: 'fsdf',
bodyZh: 'sdfsdf',
imageIds: '/uploads/tmp/image-3.png',
imageIdsZh: ''
}
but I only need the properties imageIds
, and imageIdsZh
. However tomorrow, a object might contain imageIdsBlah
and I would need to pick it up as well. I could remove the first few properties from the object, but then the next object might contain additional properties such as foo: 'bar'
values() Method: The Object. values() method is used to return an array of the object's own enumerable property values. The array can be looped using a for-loop to get all the values of the object.
To get all own properties of an object in JavaScript, you can use the Object. getOwnPropertyNames() method. This method returns an array containing all the names of the enumerable and non-enumerable own properties found directly on the object passed in as an argument.
Some functional style awesomeness:
var data = {
title: 'fsdfsd',
titleZh: 'fsdfsd',
body: 'fsdf',
bodyZh: 'sdfsdf',
imageIds: '/uploads/tmp/image-3.png',
imageIdsZh: ''
};
var z = Object.keys(data).filter(function(k) {
return k.indexOf('imageIds') == 0;
}).reduce(function(newData, k) {
newData[k] = data[k];
return newData;
}, {});
console.log(z);
Demo: http://jsfiddle.net/ngX4m/
Some minor explanation:
Array.prototype.filter()
function to filter out the keys that start with `imageIds2Array.prototype.reduce()
to convert an array of filtered keys into an object of key-value
pairs. For that we use the initial value of {}
(an empty object), fill it and return from every execution step.UPD:
A fair update from @GitaarLAB:
Object.keys
is ES5, but returns an objects own properties (so no need forobj.hasOwnProperty(key)
)
Depending on how large the object is, this may not scale well, but it will work
for(key in obj){
if(obj.hasOwnProperty(key)){
if(key.indexOf("imageIds")===0){
//do something
}
}
}
Along the lines of the answer from @zerkms, I've been working on a functional programming library for Javascript. With the tools from that library, this turns into a (somewhat dense) one-liner:
var data = {
title: 'fsdfsd',
titleZh: 'fsdfsd',
body: 'fsdf',
bodyZh: 'sdfsdf',
imageIds: '/uploads/tmp/image-3.png',
imageIdsZh: ''
};
var x = pick(filter(compose(eq("imageIds"), substring(0,8)), keys(data)), data);
console.log(x);
This code is not necessarily any better than what @zerkms posted, but it does show off some more of the power of functional abstractions beyond the few that are built into Array.prototype
.
You can see it in action on JSFiddle.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With