Уменьшить размер массива javascript, сохраняя элементы, которые равномерно распределены в оригинале

Трудно выразить словами, но я ищу функцию, которая берет массив и уменьшает его до заданного размера. Вариант использования указывает тики для графика в d3.

 const availableDatetimes: Date[] = [...]
 const numberOfXTicks = chartWidth / 80
 const tickValues = reduceArrSize(availableDatetimes, numberOfXTicks)

результат должен иметь равномерно распределенные даты

Итак, как он должен уменьшить размер? Удалить некоторые даты?

kellys 18.03.2022 16:25

@kellys да ... нужно поддерживать равномерное распределение. Предположим, что значения в массиве изначально равномерно распределены

Joey Gough 18.03.2022 16:28
Поведение ключевого слова "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
2
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я назвал это shrinkArray(), потому что сокращение массива — это название другой четко определенной операции. Вот:

const shrinkArray = (array, size) => {
    const step = array.length / size
    return array.filter((v, i) => Math.floor(i % step) == 0)
}

Давайте сократим массив размером 100 до размера 33:

const originalArray = (new Array(100).fill(0)).map((v, i) => i)

const shrunkenArray = shrinkArray(originalArray, 33)
console.info(shrunkenArray);
console.info(shrunkenArray.length == 33);

Так:

[
   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,
  12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
  24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
  36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
  60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
  72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
  84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  96, 97, 98, 99
]

сокращается до:

[
   0,  4,  7, 10, 13, 16, 19, 22, 25,
  28, 31, 34, 37, 40, 43, 46, 49, 53,
  56, 59, 62, 65, 68, 71, 74, 77, 80,
  83, 86, 89, 92, 95, 98
]

это размер 33.

В этом примере массив представляет собой целые числа от 0 до 99, но очевидно, что функция работает для любого типа данных.

Вы также можете добавить `if (array.length <= size) return array;` в качестве первой строки функции, так как в этом случае нет необходимости фильтровать. Хотя и без этой строки он работает так же, это просто напрасные вычисления.

re-za 18.03.2022 17:21

стоит ли добавить Math.floor в расчет шага так и есть const step = Math.floor(array.length / size). в любом случае я приму это, так как это почти то же самое, что я использовал. благодарю вас

Joey Gough 21.03.2022 11:15

@JoeyGough Нет, если вы добавите это, нет гарантии, что вы получите именно тот размер, который вам нужен. Например, если длина массива равна 100, и вы хотите уменьшить его до 30, у вас будет step = Math.floor(100/30) = 3, что даст вам массив размером 34.

re-za 21.03.2022 11:22

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