2015-10-07 88 views
-2

我會開始說,我知道有很多方法可以做到這一點。這個問題是努力比較不同的版本。如何檢查一個對象包含一組屬性

我也明白我們正在尋找SO是質量保證網站,而不是QAAAAAAA網站。

因此,我將優化問題,使其更加專注並最終得到一個答案。

給定一個對象:

var obj = {a: 1, b: 2, c: 3};

找出如果下面的項存在:

var keys = ['a', 'b', 'c', 'd']; // 'd' would be flagged although a boolean would suffice

理想我想這樣做的ES5,但ES6更比歡迎。

理想情況下不使用lodash,但它更受歡迎。

我敢肯定有原生Array方法一個可愛的組合會工作:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

目的是爲了有一個函數或代碼行這是小而簡潔的,而不是像:

var obj = {a: 1, b: 2, c: 3}; 
var keys = ['a', 'b', 'c', 'd']; 
var found = keys.length; 
for (var i = 0; i < keys.length; i++) { 
    if (obj.hasOwnProperty(keys[i])) { 
    found--; 
    } 
} 
console.log("Missing:", found); 

我會第一個發行韋德:

var obj = {a: 1, b: 2, c: 3}; 
var keys = ['a', 'b', 'c', 'd']; 

var allPresent = Object.keys(obj).filter(function(item) { 
    return keys.indexOf(item) !== -1; 
}).length === keys.length; 

console.log("All present:", allPresent); 
+0

嘗試'_.difference' in lodash – thefourtheye

+1

'Object.keys(obj).filter(e => keys.indexOf(item)!== -1);' – Tushar

+1

If我刪除了我的嘗試,假裝不知道有什麼辦法去做,它是否仍然需要轉向CR? –

回答

3

像這樣:

var obj = {a: 1, b: 2, c: 3}; 
 
var keys = ['a', 'b', 'c', 'd']; 
 

 
alert(keys.every(Object.prototype.hasOwnProperty, obj))

-1

考慮對象:

var obj = {a: 1, b: 2, c: 3}, 
    keys = ['a','b']; 

您可以檢查它是否包含鍵「A」使用此:

Object.keys(obj).indexOf('a') !== -1 

感謝評論這裏是完整的答案,檢查要求什麼OP的完全平等:

JSON.stringify(Object.keys(obj)) === JSON.stringify(keys) 

或部分平等

JSON.stringify(Object.keys(obj)).indexOf(JSON.stringify(keys)) !== -1 
+0

爲什麼一個人會爲此付出代價 – guramidev

+1

儘管我沒有降低你的評分,但爲了得到要求的結果,你仍然需要使用一個循環,這與OP給出的最後一個例子是一樣的。 – Shilly

+0

謝謝你們,我錯過了我的不足,我編輯了答案 – guramidev

0
allPresent = keys.reduce(function (acc, next) { 
    return !acc || obj.hasOwnProperty(next); 
}, true); 

雖然Amits答案很可能是更小,優選用於支持 '每一個' 瀏覽器。 (現在應該是所有的)

+0

'Array.prototype.every'過時'Array.prototype.reduce',並且在一個(無關緊要的)更大的安裝基礎(JS1.6 vs JS1.8)中受支持。 – Amit

+1

哦真棒,謝謝!不知道。出於某種原因,我認爲每添加一次都會被添加。但MDN知道所有。 :) – Shilly

相關問題