mohamed youssouf
mohamed youssouf

Reputation: 23

How to search in array

I have JavaScript array contains links something like this:

var urls = ['url1','url2','url3'];
  if (urls.indexOf(window.location.hostname) > -1)
{
  // do something ...
}
else {
  window.location.href = 'redirect url';
}

this code work well, but I tried to convert it to an array of objects like this:

var urls = [
  {
    'url':'url1'
  },
  {
    'url':'url2'
  },
  {
    'url':'url3'
  },
];
if (urls.url.indexOf(window.location.hostname) > -1)
{
  // do something ...
}
else {
  window.location.href = 'redirect url';
}

But this code is not working!!

How I can convert the first code into array of objects, or how I can search in array?

Upvotes: 2

Views: 212

Answers (5)

Hanushka Suren
Hanushka Suren

Reputation: 793

When it comes to arrays of objects you cannot access elements like what you have done in your code. You have to use a loop to travers through the elements or an inbuilt functions like filter,map.Without using inbuilt functions you can do something like this to get your work done.

function to search for a particular url in the array

function findURL(array,url) {

    for (var i = 0; i < array.length; i++) {

        if (array[i].url == url) {
            return i;
        }
    }
    return -1;
}

Put below piece of code where you want to check the condition

var urls = [
    {
        'url':'url1'
    },
    {
        'url':'url2'
    },
];

if(findURL(urls,window.location.hostname) > -1){
    //do something ..
}else{
    window.location.href = 'redirect url';
}

There are some answers which describe how to apply filter and map methods in your scenario.Therefore I think i don't want to put those in my answer.

If you use jquery there is a function called grep which returns an array of items found.

var urls = [
    {
        'url':'url1'
    },
    {
        'url':'url2'
    },
];

var result = $.grep(urls, function(e){ return e.url == window.location.hostname; });

if (result.length == 0) { // nothing found

   window.location.href = 'redirect url';

} else if (result.length == 1) { // one item found

      //do something ..
      // you can access the found item by result[0].foo if you want

} else { // multiple items found
  
}

Upvotes: 0

Nik Hille
Nik Hille

Reputation: 48

Using lodash version 4 or later, you could do this:

if (_(urls).map('url').includes(window.location.hostname)) {
  // do something...
} else {
  window.location.href = 'redirect url';
}

Upvotes: 0

Jagdish Idhate
Jagdish Idhate

Reputation: 7742

Or may be

if(urls.map(function(obj){ return obj.url}).indexOf(window.location.hostname)>0){
  // do something ...
}
else {
  window.location.href = 'redirect url';
}

Upvotes: 0

Axel Amthor
Axel Amthor

Reputation: 11106

First of all: Both definitions of your urls variable are JSON:

  1. first definition is an array of Strings in JSON notation
  2. second definition is an array of objects, each consisting of one property url as a string.

In order to search through the second one, you need to iterate over the objects array explicitly and compare the property explicitly (as one approach):

var found = false;
for ( var n = 0; n < urls.length; n++ )
{
    if ( urls[n].url == window.location.hostname )
    {
       /// do something

       found = true;
       break;
    }
}
if ( !found )
{

  // do something other

}

Upvotes: 0

Jaromanda X
Jaromanda X

Reputation: 1

Easiest solution is to use array.some

if(urls.some(function(item) { return item.url == window.location.hostname;})) {
    // do something ...
} else {
    window.location.href = 'redirect url';
}

more readably

var found = urls.some(function(item) { 
    return item.url == window.location.hostname;
});
if(found) {
    // do something ...
} else {
    window.location.href = 'redirect url';
}

Upvotes: 1

Related Questions