在javascript对象数组中查找其中一个属性与另一个数组中的项不匹配的项

在javascript对象数组中查找其中一个属性与另一个数组中的项不匹配的项,javascript,arrays,Javascript,Arrays,假设我有两个数组,一个是对象数组,一个是简单数组: var objArray = [{id:1,name:'fred'},{id:2,name:'john'},{id:3,name:'jane'},{id:4,name:'pete'}] var simpleArray = [1,3] 我想返回一个新数组,其中只包含来自objArray的项,其中id属性值(1,2,3等)与simpleArray中的项不匹配 我应该回来的: result = [{id:2,name:'john'},{id:4,

假设我有两个数组,一个是对象数组,一个是简单数组:

var objArray = [{id:1,name:'fred'},{id:2,name:'john'},{id:3,name:'jane'},{id:4,name:'pete'}]

var simpleArray = [1,3]
我想返回一个新数组,其中只包含来自objArray的项,其中id属性值(1,2,3等)与simpleArray中的项不匹配

我应该回来的:

result = [{id:2,name:'john'},{id:4,name:'pete'}]

我尝试了$.grep、.filter和$.inArray的各种组合,但仍在努力解决这个问题

你可以试试这个:

var results = [];

objArray.filter(function(item){
    if(simpleArray.indexOf(item.id)>-1)
        results.push(item);
})
请尝试以下代码段:

功能客户(id、名称){
这个.id=id;
this.name=name;
};
this.Customer.prototype.toString=函数(){
返回“[id:+this.id+”名称:+this.name+”];
}
var objArray=[新客户(1,'fred')、新客户(2,'john')、新客户(3,'jane')、新客户(4,'pete')];
var simpleArray=[1,3];
var结果=[];
objArray.filter(函数(项){
if(simpleArray.indexOf(item.id)>-1)
结果:推送(项目);
});

document.write(结果)
您可以尝试以下方法:

var results = [];

objArray.filter(function(item){
    if(simpleArray.indexOf(item.id)>-1)
        results.push(item);
})
请尝试以下代码段:

功能客户(id、名称){
这个.id=id;
this.name=name;
};
this.Customer.prototype.toString=函数(){
返回“[id:+this.id+”名称:+this.name+”];
}
var objArray=[新客户(1,'fred')、新客户(2,'john')、新客户(3,'jane')、新客户(4,'pete')];
var simpleArray=[1,3];
var结果=[];
objArray.filter(函数(项){
if(simpleArray.indexOf(item.id)>-1)
结果:推送(项目);
});

写(结果)
@Christos的答案适用于许多情况;但是,如果简单数组变得非常大,那么该解决方案的性能将显著降低(因为它执行的是线性搜索而不是常数时间查找)。这是一个即使在简单阵列非常大的情况下也能运行良好的解决方案

function filterByMissingProp(objects, values, propertyName) {
  var lookupTable = values.reduce(function(memo, value) {
    memo[value] = true;
    return memo;
  }, {});
  return objects.filter(function(object) {
    return !(object[propertyName] in lookupTable);
  });
}

var result = filterByMissingProp(objArray, simpleArray, 'id');
result; // => [ {id:2, name:"john"}, {id:4, name:"pete"} ]

@克里斯托斯的答案在很多情况下都是好的;但是,如果简单数组变得非常大,那么该解决方案的性能将显著降低(因为它执行的是线性搜索而不是常数时间查找)。这是一个即使在简单阵列非常大的情况下也能运行良好的解决方案

function filterByMissingProp(objects, values, propertyName) {
  var lookupTable = values.reduce(function(memo, value) {
    memo[value] = true;
    return memo;
  }, {});
  return objects.filter(function(object) {
    return !(object[propertyName] in lookupTable);
  });
}

var result = filterByMissingProp(objArray, simpleArray, 'id');
result; // => [ {id:2, name:"john"}, {id:4, name:"pete"} ]

优雅的回答,简短而漂亮。这会有用的,但是
.filter()
只是将返回值视为布尔值,因此您可以只返回
.indexOf()
测试的结果。谢谢..让我明白了。实际上我想要的是不匹配的物品,所以如果(simpleArray.indexOf(item.id)=-1)。@HowardShaw欢迎你,伙计。我很高兴我帮了忙。回答优雅,简短而漂亮。这会有用的,但是
.filter()
只是将返回值视为布尔值,所以您可以只返回
.indexOf()
测试的结果。谢谢..让我明白了。实际上我想要的是不匹配的物品,所以如果(simpleArray.indexOf(item.id)=-1)。@HowardShaw欢迎你,伙计。我很高兴我帮了忙。谢谢。我没有意识到这一点。谢谢你。我没有意识到这一点。(+1)