2016-05-10 35 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

相关问题