我正在使用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
答案 0 :(得分:2)
您的代码存在两个问题(免责声明:答案基于问题的原始版本)。
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));
用于演示此问题的简短代码段:
console.log('foo' === 'foo'); //true
console.log('f' + 'oo' === 'foo'); //true
&#13;
即使在解决了第一个问题之后
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]})
再次,一个简短的片段来演示:
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;