条件中的 JS 逻辑问题

JS logical issues in condition

我正在构建一个使用 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]);
            }
    }

'response' 是集合——我所看到的对象数组。 'entity' 很简单 - 集合中的每个实体。 'otherUsers' 是数组。

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

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

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

第一次用户比较

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

产生 false,因为 + has a higher precedence than == or ===,所以你实际上是在比较一个字符串和一个用户对象(注意你在输出中也看不到你的 "DEV_firstUserComparison:") .

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

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

演示问题的简短片段:

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

其他用户比较

即使在解决第一个问题后

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

还是returnsfalse。这是因为 otherUsers 是一个数组,您不能简单地将它们与 ==.

进行比较

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

  • How to compare arrays in JavaScript?
  • How to Compare two Arrays are Equal using Javascript?

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

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

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

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

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