2016-03-08 75 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