Проверить на пустой объект

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

  let isContactEmpty = true

  Object.keys(contact).forEach(field => {
    if (typeof contact[field] === 'string' && contact[field]) {
      isContactEmpty = false
      return
    }
    if (typeof contact[field] === 'object') {
      contact[field].forEach(fieldVal => {
        if (fieldVal.value.length) {
          isContactEmpty = false
        }
      })
    }
  })

1 ответ
1

  • Есть ли конкретная причина, по которой вы используете .forEach() вместо того for-of? Поскольку for-of использует функцию для итерации, у вас нет возможности преждевременно остановиться, если вы знаете, что контакт не пуст. Если вы использовали for-of вместо этого вы можете просто return false как только вы узнаете, что результат будет ложным.
  • Похоже, вы делаете typeof value === 'object' чтобы проверить, является ли что-то массивом. Вместо этого вы можете сделать Array.isArray(value).
  • Вы перебираете ключи объекта, но используете ключ только для получения значения поля. Почему бы просто не перебрать значения вместо Object.values()?

После применения этих предложений ваш код будет выглядеть примерно так:

function isContactEmpty(contact) {
  for (const field of Object.values(contact)) {
    if (typeof field === 'string' && field) {
      return false
    } else if (Array.isArray(field)) {
      for (const { value } of field) {
        if (value.length) return false
      }
    }
  }
  return true
}

Но мы можем пойти еще дальше. В Javascript есть функция более высокого уровня, чтобы делать именно то, что мы делаем с этими циклами, но без шаблона — array.every(). Требуется обратный вызов, который возвращает логическое значение и вызывается с каждым элементом массива. Возвращаемое значение every () истинно, если все обратные вызовы вернули истину, или ложь, если один из них возвратил ложь. (Он также прекратит итерацию, как только один обратный вызов вернет false).

const isContactEmpty = contact => (
  Object.values(contact).every(field => {
    if (typeof field === 'string') return !field
    if (Array.isArray(field)) return areArrayEntriesEmpty(field)
    return true
  })
)

const areArrayEntriesEmpty = field => (
  field.every(({ value }) => value.length === 0)
)

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *