Javascript检查字符串是否在两个数组中的任何一个

时间:2013-07-30 11:15:25

标签: javascript

我把头发拉过这一头。我有两个数组,likes& dislikes,每个都填充了大约50个字符串。

我还有一个JSON对象data.results,它包含大约50个对象,每个对象都有一个_id参数。

我正在尝试检查data.resultslikesdislikes的所有对象。

这是我目前的代码:

var newResults = []
      for(var i = 0; i<data.results.length; i++){
        for(var x = 0; x<likes.length; x++){
          if(!(data.results[i]._id == likes[x])){
            for(var y = 0; y<dislikes.length; y++){
                if(!(data.results[i]._id == dislikes[y])){
                  newResults.push(data.results[i]);
                  console.log("pushed " + data.results[i]._id);
                }
                else
                {
                   console.log("They already HATE " + data.results[i]._id + " foo!"); //temp
                }
            }
          }
          else
          {
             console.log(data.results[i]._id + " is already liked!"); //temp
          }
        }
      }

正如您所看到的,我正在遍历所有data.results个对象。然后我检查他们的_id是否在likes。如果不是,我会检查它是否在dislikes。然后,如果它仍然没有,我将它推到newResults

正如您所期望的那样,这段代码目前每次迭代都会将结果推送到我的数组中一次,所以我最终得到了大量的600个对象。

实现这一目标的好方法是什么?

4 个答案:

答案 0 :(得分:3)

for (var i = 0; i < data.results.length; i++) {
    isInLiked = (likes.indexOf(data.results[i]) > -1);
    isInHated = (dislikes.indexOf(data.results[i]) > -1);
    if (!isInLiked && !isInHated) {
        etc...
    }
}

答案 1 :(得分:1)

当检查数组是否包含元素时,Array.prototype.indexOf是ECMAScript 5,但shimmable适用于旧浏览器),会派上用场。 与按位NOT运算符~和强制转换为布尔!

结合使用时更多

让我们来看看它是如何工作的。

如果找不到Element,

Array.prototype.indexOf将返回-1。

~应用于-1会给我们0,将!应用于0会给我们true

所以!~[...].indexOf (var)为我们提供了一个布尔重新定位,即元素是否不在数组中。如果找到Element,则!!~[...].indexOf (var)的另一种方式将产生真实。

让我们将这个逻辑包装在一个contains函数中,简单地重用它。

function contains (array,element) {
    return !!~array.indexOf (element);
}

现在我们只需要一个逻辑AND &&来组合你的2个数组的输出,传递给contains函数。

var likes = ["a","b","f"] //your likes
var dislikes = ["c","g","h"] //your dislikes

var result = ["a","c","d","e","f"]; //the result containing the strings
var newresult = []; //the new result you want the strings which are NOT in likes or dislikes, being pushed to

for (var i = 0,j;j=result[i++];) //iterate over the results array
     if (!contains(likes,j) && !contains (dislikes,j)) //check if it is NOT in likes AND NOT in dislikes
           newresult.push (j) //if so, push it to the newresult array.

console.log (newresult) // ["d","e"]

这是 Fiddle

编辑备注:
1.添加了一个包含函数,如@Scott建议的那样

答案 2 :(得分:0)

使用likes.indexOf(data.results [i] ._ id)和dislikes.indexOf(data.results [i] ._ id)。

if (likes.indexOf(data.results[i]._id) != -1)
{
// they like it :D
}

答案 3 :(得分:0)

首先尝试在likesdislikes

之间创建一个公共字符串数组
var commonStrAry=[];
for(var i = 0; i<likes.length; i++){
for(var j=0; j<dislikes.length; j++){
    if(likes[i] === dislikes[j]){
        commonStrAry.push(likes[i] );
    }
}
}

然后您可以使用它来检查data.results并删除不匹配的元素。