JS логические проблемы в состоянии

javascript logical-operators kinvey

92 просмотра

1 ответ

Я создаю приложение чата с 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' - это коллекция - массив объектов из того, что я вижу. «Сущность» проста - каждая сущность внутри коллекции. «otherUsers» - это массив.

Вот что я получаю на консоли:

DEV_firstUser: alex|alex
DEV_otherUsers:|Ganka|Ganka|
true
false
Автор: Alex Источник Размещён: 08.11.2019 11:20

Ответы (1)


2 плюса

Решение

С вашим кодом есть две проблемы (отказ от ответственности: ответ основан на оригинальной версии вопроса).

сравнение первого пользователя

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

дает false, потому что +имеет более высокий приоритет, чем ==или=== , поэтому вы фактически сравниваете строку с объектом пользователя (обратите внимание, что вы также не видите свой «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));

все еще возвращается false. Это связано с тем, что otherUsersэто массив, и вы не можете просто сравнить их с ==.

Вместо этого у вас есть несколько других вариантов. Подробности смотрите в следующих вопросах о переполнении стека:

По сути: либо напишите свой собственный метод сравнения, либо преобразуйте оба массива в строку перед сравнением (что не будет работать, если элементы упорядочены по-разному).

Самый простой способ для вашего варианта использования, вероятно, будет:

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

Автор: Marvin Размещён: 20.08.2016 01:11
Вопросы из категории :
32x32