查找不在数组中的项目

时间:2011-06-21 06:32:41

标签: javascript jquery arrays

我有一系列对象,其中最多可包含6个产品,例如

var products = [{name:'Trampoline'}, {name:'Net'}, {name:'Tent'}, {name:'Hoop'}]; 
// missing Ladder & Anchor

我需要一种检查它们的方法,让它告诉我'Ladder'和'Anchor'不在数组产品中。 !$.inArray 无法工作(jquery)。

任何人都可以帮忙吗?也许我的大脑刚刚去世了,因为我无法弄明白。

我尝试从一个所需的所有项目的数组开始,但第一个循环只是将它们全部删除,因为第一个不是附件。

this.getUpsellItem = function() {

var p = this.getProduct();
var slots = ['Net','Tent','Ladder','Basketball','Anchor'];
for(var i = 0; i< p.length; i++) {
  if(p[i].display_name2.indexOf('Net') === -1) slots.splice(0,1);
  if(p[i].display_name2.indexOf('Tent') === -1) slots.splice(1,1);
  if(p[i].display_name2.indexOf('Anchor') === -1) slots.splice(3,1);
  if(p[i].display_name2.indexOf('Ladder') === -1) slots.splice(2,1);
  if(p[i].display_name2.indexOf('Basketball') === -1) slots.splice(4,1);
  console.log(p[i].display_name2.indexOf('Basketball'))
}
console.log('Printing slots')
print_r(slots)
    };

5 个答案:

答案 0 :(得分:3)

由于您正在使用jQuery,我们可以使用方便的jQuery.grep()函数仅返回slotsproducts中不存在的$.grep中的元素。 slots使用一个函数来过滤它应该返回的数组中的哪些元素以及它应该丢弃的元素。在这种情况下,我们只使用products.indexOfvar slots = [ 'Net', 'Tent', 'Ladder', 'Basketball', 'Anchor' ] , products = [ { name: 'Trampoline' }, { name: 'Net' }, { name: 'Tent' }, { name: 'Hoop' } ] , missing = $.grep(slots, function(product) { return products.indexOf({ name: product }) < 0 } ) ; console.log(missing); 中测试每个项目。这样的事情就足够了:

{{1}}

答案 1 :(得分:2)

您的问题是您有一系列对象:

var products = [{name:'Trampoline'}, {name:'Net'}, {name:'Tent'}, {name:'Hoop'}];

并且您希望基于这些对象的属性进行搜索。 indexOf method

  

使用严格相等比较[...](与===或三等号,运算符使用的方法相同)

所以你找不到你要找的东西,除非你手头有特定的对象,只是根据属性值搜索或者具有相同结构的对象不起作用。

jQuery的$.inArray实用程序函数(AFAIK)只是JavaScript实现的可移植性包装器,它们的数组中没有indexOf方法。

您需要自己的搜索功能,如下所示:

function indexOfByProperty(array, property, value) {
    for(var i = 0; i < array.length; ++i)
        if(array[i][property] == value)
            return i;
    return -1;
}

如果你想要更加严格,你也可以使用===,但这取决于你以及你需要该功能做什么。

答案 2 :(得分:0)

如果您的阵列很大,最好使用地图而不是数组

var products = {"Trampoline": {name:'Trampoline'}, "Net": {name:'Net'}, etc..};

products["foo"] returns null
products["Trampoline"] returns {name: 'Trampoline'}

在O(1)时间而不是O(n)时间

答案 3 :(得分:0)

在ES5中,您可以使用Array.some()钻取数组中的嵌套对象:

var products = [{name:'Trampoline'}, {name:'Net'}, {name:'Tent'}, {name:'Hoop'}];
var found_ladder = products.some(function(val, idx) {
    return val.name === 'Ladder';
});

答案 4 :(得分:0)

Javascript in_array函数

  

函数in_array(needle,haystack,argStrict){

     

//检查数组中是否存在给定值

     

// *例子:in_array('vlado',{0:'Kevin',vlado:'van',1:'Zonneveld'});

     

// *返回:false

     

// *例子:in_array('van',['Kevin','van','Zonneveld']);

     

// *返回:true

     

var key ='',严格= !! argStrict;

     

if(strict){

  for (key in haystack) {

      if (haystack[key] === needle) { return true;}
   }
     

}其他{

  for (key in haystack) {

    if (haystack[key] == needle) { return true; }

  }
     

}      返回false;   }