按属性

时间:2016-05-10 21:01:06

标签: javascript jquery arrays underscore.js

我正在寻找一种方法来查找一个数组中的任何对象,这些对象基于该对象的属性而存在于另一个数组中。使用jQuery或下划线的最佳方法是什么?

给出以下示例:

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

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

]

我想从array1返回第三个对象,其中 testProperty 是" C"因为它不存在于array2中。

我能够在stackoverflow上找到这个问题的几个例子,但是当需要使用这些对象的属性时,不能这样做。

5 个答案:

答案 0 :(得分: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 :(得分: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>');

答案 2 :(得分: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);

答案 3 :(得分: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))

答案 4 :(得分:1)

您可以使用下划线rejectsome来获得您想要的内容:

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

如果性能受到关注且testProperty是array2中对象的唯一键,那么您可以使用indexBy创建哈希并使用has检查结果:

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