开发者

Find an item not in array

I have an array of objects that can have up to 6 products in them e.g.

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

I need a way to check through them, and have it tell me that开发者_Python百科 'Ladder' and 'Anchor' aren't in the array products. !$.inArray doesn't work (the jquery one).

Can anyone help?? Maybe my brain has just died for the day, cos I just can't figure it out.

I tried starting with an array of all the items it needs, but the first loop through just removes them all becase the first one is not an accessory.

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)
    };


Since you're using jQuery we can use the handy jQuery.grep() function to return only the elements in slots that aren't present in products. $.grep takes a function that it uses to filter which elements in the array it should return and which it should discard. In this case we just test each item in slots using products.indexOf. Something like this should suffice:

var 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);


Your problem is that you have an array of objects:

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

And you want to search based on a property of these objects. The indexOf method:

compares [...] using strict equality (the same method used by the ===, or triple-equals, operator)

So you won't find what you're looking for unless you have the specific object in hand, just searching based on the property value or an object with the same structure won't work.

jQuery's $.inArray utility function is (AFAIK) just a portability wrapper for JavaScript implementations that don't have an indexOf method in their Array.

You'll need a search function of your own, something like this:

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

You could also use === if you want to be stricter but that's up to you and what you need the function to do.


If your array is large, you are better off using a map rather than an array

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

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

in O(1) time rather than O(n) time


In ES5 you can use Array.some() to drill into nested Objects in an array:

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


Javascript in_array function

function in_array (needle, haystack, argStrict) {

// Checks if the given value exists in the array

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

// * returns : false

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

// * returns : true

var key = '', strict = !! argStrict;

if (strict) {

  for (key in haystack) {

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

} else {

  for (key in haystack) {

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

  }

} return false; }

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜