我把头发拉过这一头。我有两个数组,likes
& dislikes
,每个都填充了大约50个字符串。
我还有一个JSON对象data.results
,它包含大约50个对象,每个对象都有一个_id
参数。
我正在尝试检查data.results
中likes
和dislikes
中不的所有对象。
这是我目前的代码:
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个对象。
实现这一目标的好方法是什么?
答案 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)
首先尝试在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并删除不匹配的元素。