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

And*_*rit 8 javascript arrays object angularjs lodash

让我们想象一下,我有一个对象数组,例如

 [{
    "firstName": "John",
    "lastName": "Doe"
 }, {
    "firstName": "Anna",
    "car": true
 }, {
    "firstName": "Peter",
    "lastName": "Jones"
 }]
Run Code Online (Sandbox Code Playgroud)

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

[firstName, lastName, car]
Run Code Online (Sandbox Code Playgroud)

我该怎么做:

我可以想象用这样的东西做这件事是可能的:

function getPropertiesNames(obj){
  var arr = [];
  for(var name in obj) {
    if(arr.indexOf(name) != -1) arr.push(name);
  }
 return arr;
} 
Run Code Online (Sandbox Code Playgroud)

为什么我需要它:

我将不得不制作一个包含多个对象的表格.因为每个对象可能有点不同,所以我需要唯一的属性名称.但是我要在angularJS中这样做,所以对于我来说,一旦使用循环来获取属性名称<th>并再次使用循环<tr ng-repeat></tr>来显示值,这是一个糟糕的选择.

我想要的是:

是否有一些选项可以从一个对象数组中获取所有唯一属性名称而无需迭代它?也许一些lodash或构建JS功能,我不知道?

use*_*291 13

仅使用的解决方案:

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);
Run Code Online (Sandbox Code Playgroud)


adi*_*iga 5

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

Object.keys(Object.assign({}, ...array)) 
Run Code Online (Sandbox Code Playgroud)

这是一个片段:

Object.keys(Object.assign({}, ...array)) 
Run Code Online (Sandbox Code Playgroud)


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

const keys = input.flatMap(Object.keys),
      unique = Array.from(new Set(keys));
Run Code Online (Sandbox Code Playgroud)

这是一个工作片段:

const array = [{firstName:"John",lastName:"Doe"},{firstName:"Anna",car:true},{firstName:"Peter",lastName:"Jones"}],
      unique = Object.keys(Object.assign({}, ...array))

console.log(unique)
Run Code Online (Sandbox Code Playgroud)

如果flatMap不支持,可以使用

const keys = [].concat(...input.map(Object.keys)),
Run Code Online (Sandbox Code Playgroud)