Получить длину массива, если конкретный ключ не равен нулю

У меня есть состояние с массивом объектов:

const [UploadLogos, setUploadLogos] = useState([
  { url: null, name: null},
  { url: 'anyURL', name: null},
  { url: null, name: null}
]); 

Я хочу получить длину этого массива, если ключ url не равен нулю.

Я делаю это так:

const UploadedLogosWithURL = UploadLogos.map((logo) => {
  return logo.url !== null;
})

<button onClick = {() => { console.info(UploadedLogosWithURL.length) }}>
  Click
</button>

Но это не работает. Где я ошибаюсь?

array.map(...).length всегда array.length (ничего общего с React, это просто базовый JS).
jonrsharpe 26.03.2024 13:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
52
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Почему бы вам просто не использовать filter()? это было бы что-то вроде:

const newArray = UploadLogos.filter(item => item.url !== null);
<button onClick = {() => { console.info(newArray.length) }}> Click </button> Надеюсь, поможет!

Ответ принят как подходящий

@kanishk6103 все правильно понял. Хотя я хотел бы сделать его более коротким, просто вернув ключ URL (он проверит, не равен ли он нулю).

const [UploadLogos, setUploadLogos] = useState([
  { url: null, name: null},
  { url: 'anyURL', name: null},
  { url: null, name: null}
]); 
<button 
   onClick = {() => { 
      console.info(UploadLogos.filter((logo) => logo.url)).length) 
   }}
>
  Click
</button>

Это тоже должно сработать.

Вы можете отфильтровать свое состояние, а затем получить длину отфильтрованного массива.

const initialLogos = [
  { url: null, name: null},
  { url: 'anyURL', name: null},
  { url: null, name: null}
]

const [logos, setLogos] = useState(initialLogos)

const logosWithUrl = logos.filter(logo => logo.url !== null);
const logosWithUrlLength = logosWithUrl.length;

Ваш код на самом деле работает нормально, проблема в использовании .map(), происходит то, что вы создаете новый массив, заполненный логическими результатами того, logo.url !== null или нет. то есть [false, true, false]

из МДН:

Метод map() экземпляров Array создает новый массив, заполненный результаты вызова предоставленной функции для каждого элемента в вызывающий массив.

Решение @ kanishk6103 могло бы решить эту проблему, но небольшое улучшение заключается в том, что вам не нужно использовать сравнение, потому что вы проверяете логические значения, поэтому более кратким способом было бы:

UploadLogos.filter(logo => logo.url);

Другие вопросы по теме