1

我正在把头发拉到这个上面。我有两个数组likes& dislikes,每个都填充了大约 50 个字符串。

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

我正在尝试检查是否在其中的所有对象data.results都不likesdislikes

这是我目前的代码:

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

4 回答 4

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...
    }
}
于 2013-07-30T11:21:46.077 回答
1

在检查 Array 是否包含元素时Array.prototype.indexOf这是 ECMAScript 5,但适用于旧版浏览器),会派上用场。结合按位非运算符~和转换为布尔值时甚至更多!

让我们看看这是如何工作的。

Array.prototype.indexOf如果未找到元素,则返回 -1。

将 a~应用于 -1 给我们0,将 an!应用于 a0给我们true

所以!~[...].indexOf (var)给了我们一个布尔表示,一个元素是否不在一个数组中。如果找到元素,则反过来!!~[...].indexOf (var)会产生 true。

让我们将此逻辑包装在 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"]

这是一个小提琴

编辑注释:
1.添加了一个包含功能,正如@Scott 建议的那样

于 2013-07-30T11:31:09.170 回答
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
}
于 2013-07-30T11:20:29.260 回答
0

likes首先尝试在和之间创建一个公共字符串数组dislikes

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 并删除不匹配的元素。

于 2013-07-30T11:30:44.993 回答