2017-01-28 2 views
4

Вот мой массив:Как получить имена свойств объектов в массиве?

var testeArray = [ 
    {name: "Jovem1", esteira: "Macaco"}, 
    {name: "Jovem", esteira: "Doido", horse: "Chimbinha"} 
]; 

Исходя из вышеизложенного, я хотел бы получить массив так:

var propertyName = ["name", "esteira", "horse"]; 

Массив содержит все имена свойств объектов в массиве объектов , Я попытался Form array of property names found in a JavaScript Object, но результат был:

['0', '1'] 
+0

Object.key (testeArray [1]) даст вам ключи – chriskelly

+2

Это потому, что вы получаете свойства * массива *, а не объекты внутри него – Li357

+3

'вар ИмениСвойства = Object.keys (Object.assign ({}, ... testeArray)); ' – 4castle

ответ

4

Вы можете перебирать массив с Array#forEach и получить ключи с Object.keys и собирать имена в объекте. Затем возьмите ключи в качестве результата.

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 с Set и 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);

+0

Это еще быстрее, поскольку не нужно называть тонны 'indexOf'. –

+0

@ibrahim mahrir Я не думаю, что это быстрее, чем использование 'indexOf' – Redu

+0

@Redu Почему? Я думаю, что объекты используют хэширование, поэтому было бы быстрее (по производительности), чем называть 'indexOf' для каждого ключа каждого объекта. –

0

Вы могли бы попробовать что-то вроде этого:

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);

0

ECMAScript5 растворе с использованием Array.prototyp.reduce() и Object.keys() функции:

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 решение с использованием Set объектов и Array.from функции:

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] в пределах new Set([...r, ...newSet]) означает, что r и newSet преобразуются в массивы и конкатенации.

1

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);

1

Сначала получите все свойства из массива с помощью Object.keys, а затем отфильтровать, чтобы получить отчетливые те

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);

0

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));

Таким образом, collectProperties(testeArray) возвращает ['name', 'esteira', 'horse'].

Или в 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)) 
0

С ES6 вы можете использовать Set и распространять синтаксис ..., чтобы сделать это.

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)

3

Вы можете очень просто сделать следующим образом; Я думаю, что это, вероятно, самый эффективный код.

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);

+0

'Object.assign' - это ES6, тогда вы можете использовать идею 4castle с расширенными объектами. –

+0

@Nina Scholz Ох .. Я не видел этого комментария. (даже я искал ключевое слово assign на странице). Это тоже довольно правильная идея, но оператор распространения «может» оказаться медленным. Позвольте мне проголосовать за его комментарий. – Redu

+0

Скорее всего, оператор распространения будет быстрее. Гораздо меньше вызовов функций. – 4castle

Смежные вопросы