2016-05-10 50 views
2

我正在尋找一種方法來根據該對象的屬性找到不存在於另一個數組中的任何對象。用jQuery或下劃線做這件事的最好方法是什麼?根據屬性查找不存在於另一個數組中的數組

考慮下面的例子:

"array1":[ 
    {"testProperty":"A"}, 
    {"testProperty":"B"}, 
    {"testProperty":"C"} 
] 

"array2":[ 
    {"testProperty":"A", "User":"Smith"}, 
    {"testProperty":"B", "User":"Smith"}, 

] 

我會想在array1其testProperty是「C」,因爲它不存在於數組2返回第三個對象。

我能在這裏找到幾個這個問題的例子在stackoverflow,但不需要這樣做時,使用這些對象的屬性。

回答

2

一個提議用簡單的Javascript與哈希表查找。

var data = { "array1": [{ "testProperty": "A" }, { "testProperty": "B" }, { "testProperty": "C" }], "array2": [{ "testProperty": "A", "User": "Smith" }, { "testProperty": "B", "User": "Smith" }, ] }, 
 
    result = data.array1.filter(function (a) { 
 
     return !this[a.testProperty]; 
 
    }, data.array2.reduce(function (r, a) { 
 
     r[a.testProperty] = true; 
 
     return r; 
 
    }, Object.create(null))); 
 

 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

+0

我喜歡jQuery的做法,但這個偉大的工程,謝謝! – Haymak3r

+1

@ Haymak3r jQuery的方法?那有什麼意思?這些答案都不需要jQuery。 – royhowie

2

您可以使用filtermap

var a = {'array1': [{"testProperty":"A"}, {"testProperty":"B"}, {"testProperty":"C"}], 'array2': [{"testProperty":"A", "User":"Smith"}, {"testProperty":"B", "User":"Smith"}]}; 
 

 
var result = a.array1.filter(function(e) { 
 
    return a.array2.map(el => { return el.testProperty}).indexOf(e.testProperty) == -1; 
 
}); 
 

 
console.log(result);

+0

謝謝你這個工作! – Haymak3r

+1

這非常低效。你可以在'filter'的每次迭代中映射所有'array2',這是完全不必要的。 – royhowie

3

我不知道這計數,但如果你能改用下劃線的lodash ,有一個很好的函數叫做differenceBy:

var _ = require("lodash"); 

var array1 = [ 
    {"testProperty":"A"}, 
    {"testProperty":"B"}, 
    {"testProperty":"C"} 
] 

var array2 = [ 
    {"testProperty":"A", "User":"Smith"}, 
    {"testProperty":"B", "User":"Smith"} 
] 

var result = _.differenceBy(array1, array2, function(item) { 
    return item["testProperty"] 
}); 

console.log(result); 
1

這裏是純ES6 JS版本使用過濾器和一些方法:

array1 = [ 
 
    {"testProperty":"A"}, 
 
    {"testProperty":"B"}, 
 
    {"testProperty":"C"} 
 
]; 
 

 
array2 =[ 
 
    {"testProperty":"A", "User":"Smith"}, 
 
    {"testProperty":"B", "User":"Smith"}, 
 

 
] 
 
    
 
var r = array1.filter(x => 
 
    ! Object.keys(x).some(z => 
 
     array2.some(w => 
 
     Object.keys(w).some(y => y === z && w[y] === x[z]) 
 
    ))); 
 
    
 
    document.write(JSON.stringify(r))

1

你可以使用下劃線的rejectsome得到你想要的東西:

var result = _.reject(array1, item => _.some(array2, {testProperty: item.testProperty})); 

如果性能是一個關注和testProperty是數組2中的對象的唯一密鑰,那麼你可以使用indexBy創建哈希值,並使用has檢查結果:

var hash = _.indexBy(array2, 'testProperty'); 
var result = _.reject(array1, item => _.has(hash, item.testProperty)); 
+0

感謝分享Gruff,很高興看到幾種不同的方式來實現相同的功能。 – Haymak3r

相關問題