Reputation: 28096
Situation
I have a JSON object which is returned. And Below is an example of one. The who
in this particular example can change to whatever property name is required. So for example next time this will be name
rather than who
[{"who":"Arthur"},{"who":"Craig"},{"who":"Dan"},{"who":"Daniel"},{"who":"Frank"},{"who":"Ian"},{"who":"jamie"},{"who":"Jason"},{"who":"jaz"},{"who":"Liam"},{"who":"Paul"},{"who":"Shaun"},{"who":"Wayne"}]
Problem
In my JS I need to be able to refer to the property and access its data without using its name as the name will always be something different.
What I have tried
data.forEach(function(m){
console.info(m); // Object { who="Craig"}
console.info(m.who); // Craig, as expected
console.info(m[0]); // now not sure who to get it if who changes to name
});
Upvotes: 25
Views: 36201
Reputation: 20830
for...in
You can also use the for in
loop:
data.forEach( function ( m ) {
for ( const key in m ) {
if (m.hasOwnProperty(key)) { // Only print properties that have not been inherited
console.log( key ); // "who"
console.log( m[key] ); // "Arthur"
}
}
});
The above would also work for multiple key: value
pairs in your object i.e:
[ {"who": "Arthur", "who": "Fred"}, {"who": "Craig"}, ]
Issues with the above:
hasOwnProperty
you might iterate over inherited propertiesfor...of
Another good option of iterating over objects is with for..of
and Object.enteries()
for ( const [key, value] of Object.entries(data) ) {
console.log( key ); // "who"
console.log( value ); // "Arthur"
}
Upvotes: 6
Reputation: 8852
Object.keys(m)[0]
should return the first enumerable property name in the object m
.
So if m = {"who": "Arthur"};
then m[Object.keys(m)[0]]
will be "Arthur"
.
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys
Alternatively: Object.values(m)[0]
. See Object.values
Upvotes: 56
Reputation: 370
If you always expect these objects to have only one property, you could do something like this:
var name, person;
for (person in data) {
for (name in data[person]) {
console.log(data[person][name]);
}
}
This would enumerate through each property of each person in the data. Because there is only one property per person (I assume), it will just enumerate that one property and stop, allowing you to use that property regardless of its name.
Upvotes: 2