如何在数组中搜索

问题描述 投票:0回答:5

我的 JavaScript 数组包含类似这样的链接:

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

这段代码运行良好,但我尝试将其转换为这样的对象数组:

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

但是这个代码不起作用!!

如何将第一个代码转换为对象数组,或者如何在数组中搜索?

javascript search
5个回答
1
投票

最简单的解决方案是使用 array.some

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

更易读

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

0
投票

首先:

urls
变量的两个定义都是 JSON:

  1. 第一个定义是 JSON 表示法中的字符串数组
  2. 第二个定义是一个对象数组,每个对象都包含一个属性
    url
    作为字符串。

为了搜索第二个,您需要显式迭代对象数组并显式比较属性(作为一种方法):

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

}

0
投票

或者可能是

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

0
投票

使用 lodash 版本 4 或更高版本,您可以执行以下操作:

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

0
投票

当涉及对象数组时,您无法像在代码中所做的那样访问元素。您必须使用循环来遍历元素或内置函数,例如filtermap。如果不使用内置函数,您可以执行类似的操作来完成工作。

在数组中搜索特定 url 的函数

function findURL(array,url) {

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

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

将下面的代码放在您要检查条件的位置

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

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

有一些答案描述了如何在您的场景中应用过滤器和映射方法。因此我认为我不想将它们放在我的答案中。

如果您使用 jquery,有一个名为 grep 的函数,它返回找到的项目数组。

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
  
}
© www.soinside.com 2019 - 2024. All rights reserved.