2017-07-20 58 views
-2

我具有低於陣列對象鍵,比較陣列在javascript

["aa","bb"] 

我具有低於對象,

{"aa":1,"bb":2,"cc":3} 

,我需要下面導致,

{"cc":3} 

我需要比較數組與對象鍵,使用循環是可能的,但它需要更多的時間來處理大量的數據,有沒有其他最快的方法來獲得我的r eshel沒有使用循環,Anyhelp讚賞...

+1

你可以分享你嘗試過的嗎? – Rajesh

+0

所以,你想在對象中找到不存在於數組中的屬性? –

+0

可能要實現這樣的功能:https://stackoverflow.com/questions/1187518/javascript-array-difference – Mike

回答

2

爲了避免二次的時間複雜度,你可以使用一個設置,並傳遞作爲this參數過濾器。然後從這些過濾鍵與Object.assign重構的對象:

var a = ["aa","bb"]; 
 
var b = {"aa":1,"bb":2,"cc":3}; 
 

 
var difference = Object.assign(...Object.keys(b).filter(function(e){ 
 
    return !this.has(e); 
 
}, new Set(a)).map(key => ({ [key]: b[key] }))); 
 

 
console.log(difference);

0

也許這樣的事情?

var a = ["aa","bb"]; 
 
var b = {"aa":1,"bb":2,"cc":3}; 
 

 
var result = {}; 
 

 
Object.keys(b).filter(function(e){ 
 
    return a.indexOf(e) < 0; 
 
}).forEach(function(e){ 
 
    result[e] = b[e]; 
 
}); 
 

 

 
console.log(result);

+0

你也可以使用'array.reduce'作爲OP想要一個丟失鍵值及其值的對象 – Rajesh

+0

@Rajesh謝謝。你是對的。我更新了代碼。 –

+0

這是一個錯誤的代碼。 OP已經明確表示這是一個BIG對象。所以循環兩次是一個壞主意。嘗試'var result = Object.keys(obj).reduce((p,c)=>(!keys.includes(c)&& p [c] = obj [c],p),{})' – Rajesh

0

遍歷對象和檢查,看看是否該屬性不數組中存在:

var a = ["aa","bb"]; 
 
var o = {"aa":1,"bb":2,"cc":3}; 
 

 
// Loop through object 
 
for(var prop in o){ 
 
    // If property doesn't exist in array... 
 
    if(a.indexOf(prop) === -1){ 
 
    console.log(prop + ":" + o[prop]); 
 
    } 
 
}

+0

我想用'.hasOwnProperty'會更好 – Rajesh

+2

@Rajesh OP沒有說任何關於繼承屬性的東西。 –

0

您可以依次通過對象並將對象鍵與數組項相比較,並將缺少的鍵作爲對象返回。

var a = ["aa","bb"] ; 
 
var o = {"aa":1,"bb":2,"cc":3,'dd':4}; 
 

 
function get(o){ 
 
var p = {}; 
 
for(var key in o){ 
 
\t if(a.indexOf(key) == -1){ 
 
    \t \t \t p[key] = o[key]; 
 
    } 
 
} 
 
return p; 
 
} 
 
var c = get(o); 
 
console.log(c);

0

可以使用Object.assign()Object.entries()Array.prototype.includes()以確定在對象當前鍵是數組的一個元素,採用計算出的屬性返回對象或虛假的,這不會導致財產被分配到新對象

var arr = ["aa","bb"] 
 

 
var obj = {"aa":1,"bb":2,"cc":3} 
 

 
var res = Object.assign({} 
 
      , ...Object.entries(obj).map(([key, prop]) => 
 
       !arr.includes(key) && {[key]:prop}) 
 
      ); 
 

 
console.log(res);

1

如果您可以改變對象,則可以使用delete刪除不需要的屬性。

const props = ["aa","bb"]; 
 
const obj = {"aa": 1,"bb": 2,"cc": 3}; 
 

 
props.forEach(prop => delete obj[prop]); 
 

 
console.log(obj);

或者只是循環屬性名稱的陣列for...of過來。

const props = ["aa","bb"]; 
 
const obj = {"aa": 1,"bb": 2,"cc": 3}; 
 

 
for (prop of props) delete obj[prop]; 
 

 
console.log(obj);

如果你不想發生變異的對象,而是創建一個沒有他一個新的不必要的屬性,然後你可以先做一個淺克隆與

newObj = {...obj}; 
+0

@Nina'道具'應該是數組,所以'(道具的道具)'一個接一個地取值。我澄清了這一點。 –