Толчок массива Javascript

1

Я пытаюсь выполнить итерацию по массиву и вывести содержимое из массива в другой массив, если они удовлетворяют некоторым основным условиям. Действительно простой материал. Пожалуйста помогите.

Получение списка БД в 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 должны находиться в массиве "базы данных".

Теги:
arrays

4 ответа

4
Лучший ответ

Вы должны использовать && вместо || в этом условии:

(!(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")) 
  • 0
    Извините за задержку ответа! Но да, ты был прав!
2

Легкий материал. :-)

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"]
  • 0
    Regex не легок, если вы новичок в программировании, и ни один из них не является фильтром.
  • 2
    ^ Я не согласен с filter . Слово идиоматически то, что вы делаете, и оно очень часто используется. Также это конкретное регулярное выражение довольно ясно.
Показать ещё 2 комментария
1

Используйте это вместо этого:

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);
0

Я не видел, чтобы это упоминалось, но я предлагаю посмотреть в 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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню