2016-03-08 36 views
1

获取的唯一密钥如果我有对象的一个​​这样的数组:从多个对象

var mountains = [ 
    { name: 'Kebnekaise', elevation: 2106 }, 
    { name: 'Mount Ngauruhoe', elevation: 2291, comment: 'aka Mount Doom' } 
]; 

如何让所有的唯一键即['name', 'elevation', 'comment']

+0

你尝试过什么?你确定它的表现是一个问题吗?你多久一次这样做,它必须是**最**性能的方式? – Barmar

+0

“*性能最高*”过于宽泛,取决于具体情况。解决你的问题。 – Amit

+1

我只需循环遍历数组,然后遍历对象的键,然后将它们作为键添加到结果对象。然后使用'Object.keys(result)'获得唯一键列表。 – Barmar

回答

5

在ECMAScript中2015年,它真的很简单:

let mountains = [ 
    { name: 'Kebnekaise', elevation: 2106 }, 
    { name: 'Mount Ngauruhoe', elevation: 2291, comment: 'aka Mount Doom' } 
]; 

let uniqueKeys = Object.keys(Object.assign({}, ...mountains)); 
1

你可以遍历对象的数组过来,遍历每个元素与Object.keys(obj)键,将其添加到哈希以避免重复:

function getKeySet (data) { 
    var keys = {}; 

    data.forEach(function (datum) { 
    Object.keys(datum).forEach(function (key) { 
     keys[key] = true; 
    }); 
    }); 

    return Object.keys(keys); 
} 

或者,您可以将所有密钥添加到数组并过滤掉重复项。无论哪种方式,这将是O(nm)其中n是阵列中元素的数量,m是键的平均数量。

3

使用ES6,一个可以做

var unique = new Set([].concat.apply([],mountains.map(Object.keys))) 

没有ES6,像

var unique = [].concat.apply([],mountains.map(Object.keys)).filter(function(value,i,arr) { 
    return arr.indexOf(value) === i; 
}); 
+2

不知道为什么这得到了一个反对票... – Amit

+0

@Amit - 我猜这是因为你是整洁,但得到所有数组键和从他们创建一套,仍然工作正常,它只是一点点时间,并没有使用传播和Object.assign – adeneo

+0

可读性,我真的希望谁投票有更好的理由。作为其他答案的函数,答案并不好或不好。 – Amit