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

时间:2015-01-20 15:29:02

标签: 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,name:'pete'}]

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

2 个答案:

答案 0 :(得分:3)

你可以尝试这个:

var results = [];

objArray.filter(function(item){
    if(simpleArray.indexOf(item.id)>-1)
        results.push(item);
})

请尝试以下代码段:

function Customer(id, name){
  this.id=id;
  this.name=name;
};

this.Customer.prototype.toString = function(){
  return "[id: "+this.id+" name: "+this.name+"]";
}

var objArray = [ new Customer(1,'fred'), new Customer(2,'john'), new Customer(3,'jane'), new Customer(4,'pete')];

var simpleArray = [1,3];

var results = [];

objArray.filter(function(item){
   
    if(simpleArray.indexOf(item.id)>-1)
        results.push(item);
});

document.write(results)

答案 1 :(得分:2)

@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"} ]