Reputation: 155
Here is my array:
var testeArray = [
{name: "Jovem1", esteira: "Macaco"},
{name: "Jovem", esteira: "Doido", horse: "Chimbinha"}
];
From the above, I would like to get a array like this:
var propertyName = ["name", "esteira", "horse"];
The array contains all the property names of the objects in the array of objects. I tried Form array of property names found in a JavaScript Object but the result was:
['0', '1']
Upvotes: 7
Views: 7462
Reputation: 26161
You can very simply do as follows; I think it's probably the most efficient code so far.
var testArray = [
{name: "Jovem1", esteira: "Macaco"},
{name: "Jovem", esteira: "Doido", horse: "Chimbinha"}
],
props = Object.keys(testArray.reduce((o,c) => Object.assign(o,c)));
console.log(props);
Upvotes: 3
Reputation: 386560
You could iterate the array with Array#forEach
and get the keys with Object.keys
and collect the names in an object. Then take the keys as result.
var testeArray = [{name: "Jovem1", esteira: "Macaco"}, {name: "Jovem", esteira: "Doido", horse: "Chimbinha" }],
names = Object.create(null),
result;
testeArray.forEach(function (o) {
Object.keys(o).forEach(function (k) {
names[k] = true;
});
});
result = Object.keys(names);
console.log(result);
ES6 with Set
and spread syntax ...
var array = [{name: "Jovem1", esteira: "Macaco"}, {name: "Jovem", esteira: "Doido", horse: "Chimbinha" }],
names = [...array.reduce((s, o) => (Object.keys(o).forEach(k => s.add(k)), s), new Set)];
console.log(names);
Upvotes: 6
Reputation: 3594
function collectProperties(arrayOfObjects) {
return arrayOfObjects.reduce(function(memo, object) {
Object.keys(object).forEach(function(key) {
if (memo.indexOf(key) === -1) { memo.push(key) };
});
return memo;
}, []);
}
var testArray = [
{name: "Jovem1", esteira: "Macaco"},
{name: "Jovem", esteira: "Doido", horse: "Chimbinha"}
];
console.log(collectProperties(testArray));
So collectProperties(testeArray)
returns ['name', 'esteira', 'horse']
.
Or in CoffeeScript:
collectProperties = (arrayOfObjects) ->
properties = []
for object in arrayOfObjects
for own property of object when property not in properties
properties.push(property)
properties
testArray = [
{name: "Jovem1", esteira: "Macaco"}
{name: "Jovem", esteira: "Doido", horse: "Chimbinha"}
]
console.log(collectProperties(testArray))
Upvotes: 0
Reputation: 92854
Ecmascript5 solution using Array.prototyp.reduce()
and Object.keys()
functions:
var testeArray = [
{name: "Jovem1", esteira: "Macaco"},
{name: "Jovem", esteira: "Doido", horse: "Chimbinha" }
],
keys = testeArray.reduce(function(r, o) {
Object.keys(o).forEach(function (k) {
if (r.indexOf(k) === -1) r.push(k);
})
return r;
}, []);
console.log(keys);
Ecmascript6 solution using Set
objects and Array.from
function:
var testeArray = [
{name: "Jovem1", esteira: "Macaco"},
{name: "Jovem", esteira: "Doido", horse: "Chimbinha" }
],
keys = testeArray.reduce(function(r, o) {
var newSet = new Set(Object.keys(o));
return new Set([...r, ...newSet]);
}, new Set());
console.log(Array.from(keys));
[...r, ...newSet]
within new Set([...r, ...newSet])
means that r
and newSet
are converted to arrays and concatenated.
Upvotes: 0
Reputation: 122037
With ES6 you can use Set
and spread syntax ...
to do this.
var testeArray = [
{name: "Jovem1", esteira: "Macaco"},
{name: "Jovem", esteira: "Doido", horse: "Chimbinha" }
];
var result = [...new Set([].concat(...testeArray.map(e => Object.keys(e))))]
console.log(result)
Upvotes: 0
Reputation: 281656
First get all the properties from the array using Object.keys
and then filter out to get the distinct ones
var testeArray = [
{name: "Jovem1", esteira: "Macaco"},
{name: "Jovem", esteira: "Doido", horse: "Chimbinha" }
]
var properties = [];
testeArray.forEach(function (o) {
Object.keys(o).forEach(function (k) {
properties.push(k)
});
});
var distProps = properties.filter(function(item, i, arr) {
return arr.indexOf(item) === i;
})
console.log(distProps);
Upvotes: 0
Reputation: 31682
var testArray = [{
name: "Jovem1",
esteira: "Macaco"
}, {
name: "Jovem",
esteira: "Doido",
horse: "Chimbinha"
}];
var propName = [];
testArray.forEach(function(o) {
Object.keys(o).forEach(function(prop) {
if (propName.indexOf(prop) < 0)
propName.push(prop);
});
});
console.log(propName);
Upvotes: 1
Reputation: 53958
You could try something like this:
var testeArray = [
{name: "Jovem1", esteira: "Macaco"},
{name: "Jovem", esteira: "Doido", horse: "Chimbinha" }
];
// The array in which we push the unique property names.
var properties = [];
testeArray.forEach(function(obj){
for(var key in obj){
if(obj.hasOwnProperty(key)
&& properties.indexOf(key) === -1) {
// It's the first time we hit key. So push it to the array.
properties.push(key);
}
}
});
console.log(properties);
Upvotes: 0