条件中的 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
我正在构建一个使用 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