#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