Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从对象数组中获取所有唯一的对象属性_Javascript_Angularjs_Arrays_Object_Lodash - Fatal编程技术网

Javascript 从对象数组中获取所有唯一的对象属性

Javascript 从对象数组中获取所有唯一的对象属性,javascript,angularjs,arrays,object,lodash,Javascript,Angularjs,Arrays,Object,Lodash,让我们假设我有一个对象数组,例如 [{ "firstName": "John", "lastName": "Doe" }, { "firstName": "Anna", "car": true }, { "firstName": "Peter", "lastName": "Jones" }] 我想从这个对象数组中获取所有唯一的属性名称,因此结果将是: [firstName, lastName, car] 我该怎么做: 我可以想象这样做是

让我们假设我有一个对象数组,例如

 [{
    "firstName": "John",
    "lastName": "Doe"
 }, {
    "firstName": "Anna",
    "car": true
 }, {
    "firstName": "Peter",
    "lastName": "Jones"
 }]
我想从这个对象数组中获取所有唯一的属性名称,因此结果将是:

[firstName, lastName, car]
我该怎么做:

我可以想象这样做是可能的:

function getPropertiesNames(obj){
  var arr = [];
  for(var name in obj) {
    if(arr.indexOf(name) != -1) arr.push(name);
  }
 return arr;
} 
我为什么需要它:

我将不得不制作一个包含多个对象的表格。因为每个对象可能有点不同,所以我需要唯一的属性名。但是,我将在angularJS中执行此操作,因此对我来说,使用loop获取
的属性名称并再次使用loop with
显示值是一种不好的选择

我想要什么:


是否有一些选项可以从对象数组中获取所有唯一的属性名,而无需对其进行迭代?也许是一些我不知道的lodash或内置JS函数?

我认为你无法摆脱检查每个对象中的每个键。您可以通过以下方式完成此任务:

var数组=[{
“名字”:“约翰”,
“姓氏”:“能源部”
}, {
“名字”:“安娜”,
“汽车”:真的吗
}, {
“名字”:“彼得”,
“姓氏”:“琼斯”
}];
var结果=u0.reduce(数组,函数(内存,对象){
for(obj中的var键){
if(memory.indexOf(key)=-1)memory.push(key)
}
返回存储器;
}, []);
控制台日志(结果)
您可以使用
map()
keys()
返回每个对象的键,然后使用
union()
展平()

var数据=[{
“名字”:“约翰”,
“姓氏”:“能源部”
}, {
“名字”:“安娜”,
“汽车”:真的吗
}, {
“名字”:“彼得”,
“姓氏”:“琼斯”
}]
变量结果=u.union(u.flatte(u.map(数据,(e)=>u.keys(e));
console.log(结果)
您可以使用:

var result = [];
array.reduce( function(pre, item) {
    Object.keys(item).forEach(function(i){
        if (result.indexOf(i) === -1){
            result.push(i);
        }
    });
});
var数组=[{
“名字”:“约翰”,
“姓氏”:“能源部”
}, {
“名字”:“安娜”,
“汽车”:真的吗
}, {
“名字”:“彼得”,
“姓氏”:“琼斯”
}];
var结果=[];
数组.reduce(函数(前,项){
Object.key(item.forEach)(函数(i){
if(结果索引of(i)=-1){
结果:推(i);
}
});
});
控制台日志(结果)仅使用以下内容的解决方案:

var数据=[{
“名字”:“约翰”,
“姓氏”:“能源部”
}, {
“名字”:“安娜”,
“汽车”:真的吗
}, {
“名字”:“彼得”,
“姓氏”:“琼斯”
}];
var uniqueKeys=Object.keys(data.reduce)(函数(result,obj){
返回Object.assign(结果,obj);
}, {}))
控制台日志(唯一键)您也可以尝试以下方法:

var source = [{
"firstName": "John",
"lastName": "Doe"
 }, {
"firstName": "Anna",
"car": true
 }, {
"firstName": "Peter",
"lastName": "Jones"
 }];

uniq(source);

function uniq(source){
   var result = source.reduce(function(p, c) {

     Object.keys(c).forEach(function(key) {
         p[key] = true;
     });

     return p;
    }, {});

    return Object.keys(result);
}

我的解决方案没有任何库

var array = [{
  "firstName": "John",
  "lastName": "Doe"
}, {
  "firstName": "Anna",
  "car": true
}, {
  "firstName": "Peter",
  "lastName": "Jones"
}];

var arr = [],merged,uniqArray;

array.forEach(function(val){ //Getting all properties
   arr.push(Object.keys(val))
 });

merged = [].concat.apply([], arr);//Merging all array to single array

merged.forEach(function(val){
  if(uniqArray.indexOf(val)== -1){// Getting uniqe values
   uniqArray.push(val)
}})
结果

["firstName", "lastName", "car"]
一个班轮方案:

[...new Set(a.map(Object.keys).reduce((a, b) => a.concat(b)))];
可以使用和将对象数组合并到单个对象。然后从合并对象中获取关键帧:

Object.keys(Object.assign({}, ...array)) 
下面是一个片段:

const数组=[{firstName:“John”,lastName:“Doe”},{firstName:“Anna”,car:true},{firstName:“Peter”,lastName:“Jones”},
unique=Object.keys(Object.assign({},…数组))

console.log(唯一)
使用平面

const arr=
[{
“名字”:“约翰”,
“姓氏”:“能源部”
}, {
“名字”:“安娜”,
“汽车”:真的吗
}, {
“名字”:“彼得”,
“姓氏”:“琼斯”
}].map(obj=>Object.getOwnPropertyNames(obj)).flat()
常量s=[…新集合(arr)]

console.log
谢谢您的回答@NenadVracar,我有两个问题要问。1.这是什么:
意思?2.与我的选项或来自Tholle的spread运算符的选项相比,任何关于性能的想法,您都可以使用扁平化来代替,就像在update中一样。您也可以像这样使用
uniq
var result=\uq.uniq(\uu.flatte(\uu.map(data,(e)=>\ukeys(e))谢谢,请不要犹豫,将其添加到您的答案:)我喜欢有多种选择。与其他ppl中的“我的代码”或“下面的代码”相比,您是否了解所有这些选项的速度?您不需要将
\uuu0.keys()
包装在箭头函数中。只需这样传递:
\uu.map(数据,\u0.keys)
谢谢你的回答@Tholle,我可以问你使用这个而不是经典循环有什么好处吗?我打赌我错过了一些东西,但从文件上看,这听起来像是古板的loop@Andurit不客气!如果您有一个大的数组,则常规循环可能会更快。如果您有一个小数组,并且您和我一样,发现reduce更具可读性,您可能会使用以下解决方案之一。您好,谢谢您的回答。它看起来更具可读性。然而,我可以问你,与常规循环相比,它是否会更快,或者这个问题的答案是否会更快?它不会比常规循环更快。我不确定是否有显著的区别。使用这些标准方法的主要好处是它们是安全的(如,它们遵循js标准),并且易于阅读和理解。看看链接文章中的polyfills,了解他们在引擎盖下做什么。我看到有人不喜欢它。
Object.keys(Object.assign({}, ...array))