首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从对象数组中获取所有唯一的对象属性

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

Stack Overflow用户
提问于 2016-08-31 11:41:04
回答 9查看 12.5K关注 0票数 17

让我们想象一下,我有一组对象。

代码语言:javascript
运行
复制
 [{
    "firstName": "John",
    "lastName": "Doe"
 }, {
    "firstName": "Anna",
    "car": true
 }, {
    "firstName": "Peter",
    "lastName": "Jones"
 }]

我想从这个对象数组中获取所有唯一的属性名,所以结果是:

代码语言:javascript
运行
复制
[firstName, lastName, car]

我该怎么做:

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

代码语言:javascript
运行
复制
function getPropertiesNames(obj){
  var arr = [];
  for(var name in obj) {
    if(arr.indexOf(name) != -1) arr.push(name);
  }
 return arr;
} 

为什么我需要它:

我得做一张由多个对象组成的表格。因为每个对象可能有点不同,所以我需要唯一的属性名。但是,我将在angularJS中这样做,因此,一次使用循环来获取<th>的属性名,再一次使用带<tr ng-repeat></tr>的循环来显示值,这对我来说是一种糟糕的选择。

我想要的:

是否有一些选项可以在不迭代对象的情况下从对象数组中获取所有唯一的属性名称?也许是一些我不知道的JS功能呢?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2016-08-31 12:03:02

仅使用以下方法的解决方案:

代码语言:javascript
运行
复制
var data = [{
  "firstName": "John",
  "lastName": "Doe"
}, {
  "firstName": "Anna",
  "car": true
}, {
  "firstName": "Peter",
  "lastName": "Jones"
}];

var uniqueKeys = Object.keys(data.reduce(function(result, obj) {
  return Object.assign(result, obj);
}, {}))

console.log(uniqueKeys);

票数 24
EN

Stack Overflow用户

发布于 2016-08-31 11:53:53

您可以使用map()keys()返回每个对象的键,然后返回union()flatten()

代码语言:javascript
运行
复制
var data = [{
  "firstName": "John",
  "lastName": "Doe"
}, {
  "firstName": "Anna",
  "car": true
}, {
  "firstName": "Peter",
  "lastName": "Jones"
}]

var result = _.union(_.flatten(_.map(data, (e) => _.keys(e))));
console.log(result)
代码语言:javascript
运行
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

票数 4
EN

Stack Overflow用户

发布于 2019-07-15 08:30:36

可以使用Object.assign()扩展语法将对象数组合并到单个对象。然后从合并的对象获取键:

代码语言:javascript
运行
复制
Object.keys(Object.assign({}, ...array)) 

这里有一个片段:

代码语言:javascript
运行
复制
const array = [{firstName:"John",lastName:"Doe"},{firstName:"Anna",car:true},{firstName:"Peter",lastName:"Jones"}],
      unique = Object.keys(Object.assign({}, ...array))

console.log(unique)

另一种选择是使用Object.keys作为对flatMap的回调。这将返回所有键的数组。然后,创建一个Set来获取唯一的键,并使用Array.from()将集合转换为一个数组。

代码语言:javascript
运行
复制
const keys = input.flatMap(Object.keys),
      unique = Array.from(new Set(keys));

这里有一个有用的片段:

代码语言:javascript
运行
复制
const input=[{firstName:"John",lastName:"Doe"},{firstName:"Anna",car:true},{firstName:"Peter",lastName:"Jones"}],
      unique = Array.from(new Set(input.flatMap(Object.keys)));

console.log(unique)

如果不支持flatMap,则可以使用

代码语言:javascript
运行
复制
const keys = [].concat(...input.map(Object.keys)),
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39248687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档