Javascript 如何获取数组中对象的属性名?

Javascript 如何获取数组中对象的属性名?,javascript,arrays,object,Javascript,Arrays,Object,这是我的阵列: var testeArray = [ {name: "Jovem1", esteira: "Macaco"}, {name: "Jovem", esteira: "Doido", horse: "Chimbinha"} ]; 从上面,我想得到如下数组: var propertyName = ["name", "esteira", "horse"]; 该数组包含对象数组中对象的所有属性名。我试过了,但结果是: ['0', '1'] 可以使用迭代数组,使用获取键

这是我的阵列:

var testeArray = [
    {name: "Jovem1", esteira: "Macaco"},
    {name: "Jovem", esteira: "Doido", horse: "Chimbinha"}
];
从上面,我想得到如下数组:

var propertyName = ["name", "esteira", "horse"];
该数组包含对象数组中对象的所有属性名。我试过了,但结果是:

['0', '1']

可以使用迭代数组,使用获取键,并收集对象中的名称。然后把钥匙作为结果

var testeArray=[{name:“Jovem1”,esteira:“Macaco”},{name:“Jovem”,esteira:“Doido”,horse:“Chimbinha”}],
名称=对象。创建(空),
结果;
testeArray.forEach(函数(o){
Object.keys(o).forEach(函数(k){
名称[k]=true;
});
});
结果=Object.key(名称);

控制台日志(结果)您可以尝试以下方法:

var propertyName = ["name", "esteira", "horse"];
var testeArray=[
{姓名:“Jovem1”,埃斯特拉:“Macaco”},
{名字:“乔维姆”,埃斯特拉:“多伊多”,马:“钦宾哈”}
];
//在其中推送唯一属性名称的数组。
var属性=[];
testeArray.forEach(函数(obj){
for(obj中的var键){
if(对象hasOwnProperty(键)
&&properties.indexOf(key)=-1{
//这是我们第一次按这个键。所以把它推到数组中。
属性。按(键);
}
}
});
console.log(属性)ECMAScript 5使用
Array.prototyp.reduce()
Object.keys()函数的解决方案:

var testeArray=[
{姓名:“Jovem1”,埃斯特拉:“Macaco”},
{名字:“乔维姆”,埃斯特拉:“多伊多”,马:“钦宾哈”}
],
keys=testeArray.reduce(函数(r,o){
Object.keys(o).forEach(函数(k){
如果(r.indexOf(k)=-1)r.push(k);
})
返回r;
}, []);
控制台日志(键)
var testArray=[{
名称:“Jovem1”,
埃斯特拉:“麦卡科”
}, {
姓名:“Jovem”,
埃斯特拉:“多伊多”,
马:“Chimbinha”
}];
var propName=[];
testArray.forEach(函数(o){
Object.keys(o).forEach(函数(prop){
if(propName.indexOf(prop)<0)
propName.push(prop);
});
});

console.log(propName)
首先使用
Object.keys
从数组中获取所有属性,然后筛选出不同的属性

var testeArray=[
{姓名:“Jovem1”,埃斯特拉:“Macaco”},
{名字:“乔维姆”,埃斯特拉:“多伊多”,马:“钦宾哈”}
]
var属性=[];
testeArray.forEach(函数(o){
Object.keys(o).forEach(函数(k){
属性。推送(k)
});
});
var distProps=properties.filter(函数(项、i、arr){
返回arr.indexOf(项目)==i;
})
控制台日志(distProps)
函数集合属性(arrayOfObjects){
返回arrayOfObjects.reduce(函数(备注,对象){
Object.keys(对象).forEach(函数(键){
if(memo.indexOf(key)==-1{memo.push(key)};
});
返回备忘录;
}, []);
}
var testArray=[
{姓名:“Jovem1”,埃斯特拉:“Macaco”},
{名字:“乔维姆”,埃斯特拉:“多伊多”,马:“钦宾哈”}
];

日志(collectProperties(testArray))对于ES6,您可以使用
Set
和扩展语法
来执行此操作

var testeArray=[
{姓名:“Jovem1”,埃斯特拉:“Macaco”},
{名字:“乔维姆”,埃斯特拉:“多伊多”,马:“钦宾哈”}
];
var result=[…新集合([].concat(…testeArray.map(e=>Object.keys(e)))]

log(result)
您可以非常简单地执行以下操作:;我认为这可能是迄今为止最有效的代码

var testArray=[
{姓名:“Jovem1”,埃斯特拉:“Macaco”},
{名字:“乔维姆”,埃斯特拉:“多伊多”,马:“钦宾哈”}
],
props=Object.keys(testArray.reduce((o,c)=>Object.assign(o,c));

控制台日志(道具)
这是因为你得到的是数组的属性,而不是数组中的对象,这会更快,因为它不需要调用大量的
indexOf
@ibrahim mahrir,我不认为这比使用
indexOf
@Redu更快为什么?我认为对象使用散列,所以它比为每个对象的每个键调用
indexOf
更快(在性能上)。@Redu您在下面的回答中自己说过。哈哈。(尽可能快)@ibrahim mahrir你正在用
indexOf
阻止被骗,Nina Scholz也在用一个固定对象做同样的工作。你认为Set对象能在O(1)时间内神奇地消除重复吗。。?这两种代码在性能上应该是相似的。
Object.assign
是ES6,那么你可以用4castle的思想来处理扩展对象。@Nina Scholz Oh。。我没有看到那评论。(即使我在页面中搜索了assign关键字)这当然也是一个非常有效的想法,但是spread操作符“可能”会很慢。让我投票支持他的评论。更可能的是,spread operator会更快。函数调用要少得多。@4castle函数调用可能是正确的。我希望我能使
.reduce(Object.assign)
I
a
(索引和数组本身)跳入混合状态。@4卡斯特我很好奇。。所以我做了一些。您的代码似乎有两个问题。1) 因为我怀疑它的速度很慢,是因为扩频操作。2) 更重要的是,spread operator还有一个主要缺点。。您不能使用无限多个项目的数组为其提供数据。。在这种特殊情况下,对于超过500K的项目,您将得到一个RangeError:超过最大调用堆栈大小。。。所以也有。