Я пытаюсь выполнить итерацию по массиву и вывести содержимое из массива в другой массив, если они удовлетворяют некоторым основным условиям. Действительно простой материал. Пожалуйста помогите.
Получение списка БД в MongoDB
>>var dbs = db.getMongo().getDBNames();
>>dbs
[ "admin", "newdb", "newdb2", "local", "test" ]
Получить длину массива:
var arrayLength = dbs.length;
Создание пустого массива
var databases = []
Нажатие на массив массивов баз данных из массива dbs, если содержимое не равно "admin", "local" или "test",
for (var i = 0 ; i < arrayLength; i++) {
if (!(dbs[i] == "admin") || !(dbs[i] == "local") || !(dbs[i] == "test")) {
databases.push(dbs[i]);
}
}
Ожидается, что в массиве баз данных будут только "newdb" и "newdb2". Но все толкается
>databases
[ "admin", "newdb", "newdb2", "local", "test" ]
Что здесь происходит? Только newdb и newdb2 должны находиться в массиве "базы данных".
Вы должны использовать &&
вместо ||
в этом условии:
(!(dbs[i] == "admin") || !(dbs[i] == "local") || !(dbs[i] == "test"))
То, как это написано выше, это "значение не A ИЛИ не B ИЛИ не C", которое будет истинным для всего. (Например, A не B).
Вы имеете в виду, что это означает, что "значение не есть A, а не B, а не C".
(!(dbs[i] == "admin") && !(dbs[i] == "local") && !(dbs[i] == "test"))
Легкий материал. :-)
var dbs = [ "admin", "newdb", "newdb2", "local", "test" ];
var filterShema = new RegExp(/admin|local|test/);
var databases = dbs.filter(function(db) { return !filterShema.test(db); });
> databases
["newdb", "newdb2"]
filter
. Слово идиоматически то, что вы делаете, и оно очень часто используется. Также это конкретное регулярное выражение довольно ясно.
Используйте это вместо этого:
var dbs = [ "admin", "newdb", "newdb2", "local", "test" ];
var arrayLength = dbs.length;
var databases = [];
for (var i = 0 ; i < arrayLength; i++){
if ((dbs[i] != "admin") && (dbs[i] != "local") && (dbs[i] != "test"))
{
databases.push(dbs[i])
}
}
console.log(databases);
Я не видел, чтобы это упоминалось, но я предлагаю посмотреть в Array.prototype.filter. Это создает для вас второй массив, а также управляет итерацией по значениям первого массива. Я бы также избегал большого набора условий и просто полагался на Array.prototype.includes, чтобы сделать работу для вас.
var dbs = ["admin", "newdb", "newdb2", "local", "test"];
var unwantedValues = ["admin", "local", "test"];
var databases = dbs.filter(function(value) {
return !unwantedValues.includes(value);
});
Edit, вы могли бы также думать об этом как о создании дополнения, как в математике.
// Create this as a utility function in your code
// Return a new array object that contains all values from arrayA
// that are not in arrayB
function complement(arrayA, arrayB) {
return arrayA.filter(function(value) {
return !arrayB.includes(value);
});
}
// Then call it
var databases = complement(dbs, unwantedValuesArray);