JS逻辑问题的条件

时间:2016-08-20 12:59:18

标签: javascript logical-operators kinvey

我正在使用Kinvey mbaas构建一个聊天应用程序作为数据库。我有一个存储聊天的集合,其中包含以下数据列:_id,firstUser,otherUsers,history。到目前为止,这个想法是:当发布消息时,GET被要求查找两个用户之间是否有聊天。 GET接受整个集合并迭代条目并检查firstUser和otherUsers是否匹配。这就是问题所在:它们永远不会匹配。代码如下:

for (let entity = 0; entity < response.length; entity++) {
console.log('DEV_firstUser: ' 
                 + response[entity]['firstUser'] + '|' + firstUser);
    console.log('DEV_otherUsers: |' 
                 + response[entity]['otherUsers'] + '|' + otherUsers + "|");

    console.log(response[entity]['firstUser'] === firstUser);
    console.log(response[entity]['otherUsers'] === otherUsers);
    // The problematic condition - the logs above are demonstrations.
    if (response[entity]['firstUser'] === firstUser 
            && response[entity]['otherUsers'] === otherUsers) {
                id = response[entity]['_id'];
                console.log('DEV_id: ' + id);
                index = entity;
                console.log(response[index][id]);
            }
    }

&#39;响应&#39;是集合 - 我可以看到的对象数组。 &#39;实体&#39;很简单 - 集合中的每个实体。 &#39; otherUsers&#39;是数组。

这是我在控制台上得到的:

DEV_firstUser: alex|alex
DEV_otherUsers:|Ganka|Ganka|
true
false

1 个答案:

答案 0 :(得分:2)

您的代码存在两个问题(免责声明:答案基于问题的原始版本)。

firstUser比较

console.log('DEV_firstUserComparison: ' 
    + response[entity]['firstUser'] == firstUser);

产生false,因为+ has a higher precedence than == or ===,所以您实际上将字符串与用户对象进行比较(请注意您也不会看到您的&#34; DEV_firstUserComparison:& #34;在输出中。)

相反,将比较放在括号中:

console.log('DEV_firstUserComparison: ' 
        + (response[entity]['firstUser'] == firstUser));

用于演示此问题的简短代码段:

&#13;
&#13;
console.log('foo' === 'foo');      //true
console.log('f' + 'oo' === 'foo'); //true
&#13;
&#13;
&#13;

otherUsers比较

即使在解决了第一个问题之后

console.log('DEV_otherUsersComparison: ' 
    + (response[entity]['otherUsers'] == otherUsers));

仍会返回false。这是因为otherUsers是一个数组,您不能简单地将它们与==进行比较。

相反,您还有其他一些选择。有关详细信息,请参阅Stack Overflow上的以下问题:

基本上:要么编写自己的比较方法,要么在比较之前将两个数组转换为字符串(当元素的排序方式不同时,这将不起作用。)

您的用例最简单的方法可能是:

response[entity]['otherUsers'].length == otherUsers.length
  && response[entity]['otherUsers'].every(function(v, i) { return v == otherUsers[i]})

再次,一个简短的片段来演示:

&#13;
&#13;
var array1 = ['foo', 'bar'];
var array2 = ['foo', 'bar'];

function eq(a1, a2) {
  return a1.length == a2.length && a1.every(function(v, i) {
    return v === a2[i]
  });
}

console.log(array1 == array2);   //false
console.log(eq(array1, array2)); //true
&#13;
&#13;
&#13;