Как я могу проверить, что определенный ключ в массиве пуст в каждом индексе?

#javascript #arrays #ecmascript-6

Вопрос:

Итак, у меня есть массив объектов для перебора, на каждой итерации мне нужно проверять, имеет ли названный ключ blocks длину или нет.

Если все blocks ключи пусты (длина === 0), то мне нужно выполнить операцию, в противном случае нет. Понял? Если ТОЛЬКО у ОДНОГО blocks ключа есть a length > 0 , то операции следует избегать.

     for (let i = 0; i < blockColumns.length; i  ) {
      if (!blockColumns[i].blocks.length) {
        // TRIGGER OPERATION
      }
    }
 

В приведенном выше коде проблема заключается в том, что операция будет запущена, когда по крайней мере один blocks ключ не имеет длины, а это мне не нужно. Операция должна запускаться ТОЛЬКО тогда, когда все blocks ключи есть length === 0 .

Ответ №1:

Используйте Array.every() , чтобы проверить, что каждый элемент имеет длину 0 (!0 === true). Если все элементы имеют длину 0, то каждый вернется true . Если false встречается a (т. Е. длина > 0), каждый вернет > false немедленно.

 const allEmpty = blockColumns.every(o => !o.blocks.length)

if(allEmpty) doSomething()
 

Ответ №2:

Это звучит как нечто, для чего Array.prototype.every был бы полезен:

 if (blockColumns.every((el) => el?.blocks?.length === 0)) {
    // Do your operation
}
 

Я использовал здесь необязательную цепочку, так как я не уверен, может ли быть случай, когда у элемента нет blocks свойства, или если у этого свойства может не быть length свойства. Но в зависимости от того, насколько вы уверены в своей структуре данных, вам может и не понадобиться этого делать.

Ответ №3:

что ж, тогда вы можете сделать

 x = 0
for (let i = 0; i < blockColumns.length; i  ) {
      if (!blockColumns[i].blocks.length > 0) {
        x =1;
      }
    }
   if(x == blockColumns.length){
     //do something
    }
 

это очень простой способ сделать это, и я не думаю, что он вообще эффективен, но на данный момент он выполняет свою работу 😀

Ответ №4:

    let doOperation = true;
   for (let i = 0; i < blockColumns.length; i  ) {
       if (blockColumns[i].blocks.length > 0) {
           doOperation = false
       }
   }
   if (doOperation) {
       //Some operation
   }
 

не уверен, что я последую за вами, но сработает ли это?

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

1. Это не работает. Помните, что если ВСЕ БЛОКИ пусты, операция должна сработать.

2. @Реагирование-это именно то, что делает этот код? Если какой-либо блок непуст, doOperation становится false .