фильтр массива не работает на множестве объектов MongoDB

#javascript #arrays #mongodb #filter

#javascript #массивы #mongodb #Фильтр

Вопрос:

Мне нужен массив идентификаторов, не входящих в другой массив идентификаторов. У меня нет проблем с прямым javascript — но когда я пытаюсь использовать массивы, возвращаемые из MongoDB — фильтры не работают.

Примеры:

Сначала давайте посмотрим на два массива…

 x.user_ids is ["5b579074dc1eac0014276442","5b574e03dc1eac0014276418"] 
x.user_bad_ids is ["5b574e03dc1eac0014276419","5b579074dc1eac0014276442"]
  

Я хотел бы, чтобы конечный массив был (в этом примере есть только один «хороший» идентификатор)

 ["5b574e03dc1eac0014276418"] 
  

Я попробовал ПРОСТОЙ фильтр

 console.log( x.user_ids.filter(e => !x.user_bad_ids.includes(e)) );
  

но я получаю

 [ 5b579074dc1eac0014276442, 5b574e03dc1eac0014276418 ]
  

Я отмечаю, что теперь есть кавычки…Я не уверен, что js не нравятся массивы идентификаторов объектов из mongo

Я попробовал что-то более «олдскульное»

 var tempArr = x.user_ids.filter(function(item) {
    return !x.user_bad_ids.includes(item);
});
console.log( tempArr );
  

но я получаю

 [ 5b579074dc1eac0014276442, 5b574e03dc1eac0014276418 ]
  

И, наконец, — некоторая подробная функция

     Array.prototype.uniqueFrom = function() {
      if (!arguments.length)
        return [];
      var a1 = this.slice(0); // Start with a copy

      for (var n=0; n < arguments.length; n  ) {
        var a2 = arguments[n];
        if (!(a2 instanceof Array))
          throw new TypeError( 'argument [' n '] must be Array' );

        for(var i=0; i<a2.length; i  ) {
          var index = a1.indexOf(a2[i]);
          if (index > -1) {
            a1.splice(index, 1);
          }
        }
      }
      return a1;
    }

    console.log( x.user_ids.uniqueFrom(x.user_bad_ids) );
  

Я получаю

 [ 5b579074dc1eac0014276442, 5b574e03dc1eac0014276418 ]
  

Во всех случаях я ожидаю, что … 76442 будет отфильтрован, я что-то упускаю в массивах идентификаторов объектов, выходящих из mongo?

Комментарии:

1. Вы проверили тип ObjectId , возвращаемый из MongoDB? Я подозреваю, что это может быть представление объекта — в этом случае вам может потребоваться преобразовать это в string при сравнении

2. спасибо Ajai — пример?

3. x.user_ids.filter(id => !x.user_bad_ids.some(badId => id.toString() === badId.toString())) ссылка: docs.mongodb.com/manual/reference/method/ObjectId.toString