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:超过最大调用堆栈大小。。。所以也有。