Получить макс/мин из массива строк (javascript)

Любые идеи для вычисления min/max из массива строк?

var arr = ['aab','aac','aad','abx'];

До сих пор я рассматривал возможность использования функции .sort() в зависимости от макс/мин и получения первого элемента результата.

Но, может быть, вы знаете лучшее решение для преформирования?

Обновлено: размер массива меньше 1 тыс. элементов. Под Min/max я имел в виду алфавитную сортировку: первый и последний элемент.

что такое max и min в данном случае?

Nina Scholz 13.02.2019 16:12

Что вы считаете «минимум» и «максимум» строки в этом случае?

Igy 13.02.2019 16:12

Я не понимаю. Как вы хотите рассчитать максимум или минимум строки?

Rod Ramírez 13.02.2019 16:13

Что ж, если бы сортировка давала осмысленный ответ, то что-то вроде .localeCompare() можно было бы использовать за один проход.

Pointy 13.02.2019 16:13

ОП сказал, что он рассматривал сортировку, поэтому max / min можно было бы предположить, что это альфа-сортировка, первая и последняя.

Keith 13.02.2019 16:14

Перебирайте свой список и обновляйте минимум и максимум на каждом шаге итерации.

Thomas Sablik 13.02.2019 16:14

«лучшее предварительное решение», если это размер ваших данных, производительность сортировки должна быть наименьшей из ваших проблем.

Federico klez Culloca 13.02.2019 16:16

Я дал ответ, но я чувствую, что этот вопрос должен быть улучшен. Что вы имеете в виду под max/min

cr05s19xx 13.02.2019 16:20

Размер массива меньше 1k элементов. Под Min/max я имел в виду алфавитную сортировку первого и последнего элемента.

IT Man 13.02.2019 16:23

минимум - это элемент множества, для которого в том же множестве не существует меньших элементов. Таким образом, некоторые базы данных определяют минимум для всех доступных для заказа типов данных. Также у python есть minium, который работает и со String. Некоторые также поддерживают сумму строк.

Lee 16.07.2020 21: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) для оценки ваших знаний,...
2
10
5 682
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вот несколько решений, на которые стоит обратить внимание:

Мин./макс. в зависимости от длины

const output = arr.sort((a, b) => a.length - b.length);

Мин./макс. в алфавитном порядке

const output = arr.sort();

Извлеките минимум и максимум

const max = arr.sort(() => 1)[0];

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

Federico klez Culloca 13.02.2019 16:17

@ФедерикоклезКуллока. Отмеченный

cr05s19xx 13.02.2019 16:17

Я вижу, вы изменили ответ, но будьте осторожны, он дает TypeError для аргумента sort

Federico klez Culloca 13.02.2019 16:22

Спасибо, что обратили на это мое внимание

cr05s19xx 13.02.2019 16:27

Послушайте, извините, если я вас мучаю, но та функция, которую вы использовали для сортировки, на самом деле не сортирует. Поскольку ОП сказал, что они имели в виду лексикографическую сортировку, вы можете просто использовать const min = arr.sort()[0]; для извлечения мин. И вам все еще не хватает max.

Federico klez Culloca 13.02.2019 16:30

@FedericoklezCulloca, на самом деле это не так. Я считаю, что он может просто запустить arr.sort().reverse()[0], чтобы получить максимальное значение

cr05s19xx 13.02.2019 16:33
Ответ принят как подходящий

Перебирайте свой список и обновляйте минимум и максимум на каждом шаге итерации.

function getMinMax(arr) {
  if (!arr) {
    return null;
  }
  var minV = arr[0];
  var maxV = arr[0];
  for (a of arr) {
    if (a < minV) minV = a;
    if (a > maxV) maxV = a;
  }
  return [minV, maxV];
}

console.info(getMinMax(['abc', 'aaa', 'abb']));

Это должно быть намного быстрее, чем sort() для больших массивов. Этот алгоритм является O (n), в то время как sort() не менее O (n log (n)).

Если вы не хотите использовать сортировку, .

Другой вариант — использовать Array.reduce для сохранения значений min и max.

Ниже приведен рабочий фрагмент, показывающий это.

пс. В ваших тестовых данных уже был минимальный элемент в качестве первого элемента и максимальный элемент в качестве последнего элемента, поэтому я изменил пример массива, чтобы он имел zzz, что, конечно же, будет max.

var arr = ['aab','aac','zzz','aad','abx'];

var ret = arr.reduce((a, v) => {
  a.min = a.min === null ? v :
    v.localeCompare(a.min) < 0 ? v : a.min; 
  a.max = a.max === null ? v : 
    v.localeCompare(a.max) > 0 ? v : a.max;
  return a; }, 
{min: null, max: null});

console.info(ret);

Вы можете использовать сокращение за один проход, но вам нужно проверить, что вернуть, если массив пуст (в настоящее время возвращает значение undefined как для минимального, так и для максимального значения)

const arr = [
  'aab',
  'aac',
  'aad',
  'abx',
];

console.info(
  arr.reduce(
    ([min, max], item) => [
      min.localeCompare(item) > 0
        ? item
        : min,
      max.localeCompare(item) < 0
        ? item
        : max,
    ],
    [arr[0], arr[0]],
  ),
);

Вот что я сделал (обратите внимание, что он мутирует исходный массив):

const myArray = ['beta', 'alpha', 'zeta', 'delta'];
const min = myArray.sort()[0];
const max = myArray.reverse()[0];
console.info({ min, max });

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