Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сортировка массива по значениям (https://javascript.ru/forum/misc/74399-sortirovka-massiva-po-znacheniyam.html)

MC-XOBAHCK 07.07.2018 11:58

Сортировка массива по значениям
 
Есть массив из чисел:
let ostatki = [170,170,170,170,170,890,130,130,130,260];

Можно ли из него получить такой результат:

Остатки: 170 мм - 5 штук; 890 мм - 1 штук; 130 мм - 3 штук; 260 мм - 1 штук

И можно ли его потом отсортировать от меньшего к большему, чтобы вывести вот так:
Остатки: 130 мм - 3 штук; 170 мм - 5 штук; 260 мм - 1 штук; 890 мм - 1 штук;

Я пробую освоить и внедрять в свои скрипты методы filter, map и др. но у меня в практике пока самые простые применения. Поэтому я ещё туго соображаю как это работает. А вот как раз появилась задачка и хотелось бы увидеть как правильно делают решение.

Со склонением падежей слова штук проблем нет, я знаю как это сделать и внедрить.

laimas 07.07.2018 13:14

Сначала сортируем, а затем выборка с припиской.

MC-XOBAHCK 07.07.2018 13:40

Методы сортировки я нашёл в учебнике: https://learn.javascript.ru/array-me...of-lastindexof
сижу пробую, изучаю. Что числа сортируются по первым цифрам - это я понял. Нужно писать свою функцию для arr.sort(compareNumeric);
Я такого не делал, поэтому у меня пока нет идей с построением логики. Но думаю они появятся, ещё погуглю.
А вот с группировкой значений - вообще темнота.

laimas 07.07.2018 14:21

Цитата:

Сообщение от MC-XOBAHCK
Что числа сортируются по первым цифрам - это я понял.

Сортируется просто как числа - от меньшего к большему. Если я правильно понял, то у вас есть массив исходник, который нужно выводить с различными представлениями. Значит отсортировали, выбрали, хотя можно отсортировать и результат.

j0hnik 07.07.2018 15:44

let ostatki = [170,170,170,170,170,890,130,130,130,260];

ostatki = ostatki.map(el=> el+'мм - '+ostatki.filter(x=> x==el).length +'штук').filter((e, i, s)=>s.indexOf(e) === i).sort((a,b)=> parseInt(a)- parseInt(b));

console.log(ostatki);

рони 07.07.2018 16:14

MC-XOBAHCK,
<script>
var ostatki = [170,170,170,170,170,890,130,130,130,260], out = {};
ostatki.forEach(function(a) {
  out[a] = (out[a]||0)+1
});
out = Object.keys(out).sort(function(a,b) {
   return a - b
}).map(function(a) {
   return a+'мм - ' + out[a] +' штук'
})
document.write(JSON.stringify(out, null, 4))

  </script>

MC-XOBAHCK 07.07.2018 17:44

Цитата:

Сообщение от laimas (Сообщение 489243)
Если я правильно понял, то у вас есть массив исходник, который нужно выводить с различными представлениями.

У меня значения пушатся в этот массив из нескольких циклов. Он генерируется (если я правильно понял про массив исходник).

Процесс штрипсования тонколистового металла (если что).
Более понятный пример по аналогии - листики A4 разрезать вдоль на визитки. Визитки 4-х вариантов: стандарт, супер-биг, мини и микро (в общем разных размеров).
Режим листик А4 на супер-биг визитки - получается остаток из которого можно нарезать других видов визиток.
Поэтому нужно обрезки собрать и пустить тут же в дело, чтобы сэкономить листиков А4. Как то так, только листики 2000 х 1250 мм.

j0hnik, рони СПАСИБО!
Мне на вскидку понятнее вариант j0hnik. Разобью на части, посмотрю как поэтапно работают скрипты. Возможно промежуточные этапы мне понадобятся как отдельные значения.

Alexandroppolus 07.07.2018 19:11

Цитата:

Сообщение от MC-XOBAHCK
Мне на вскидку понятнее вариант j0hnik

А много ли пунктов в массиве? Если много, то рекомендую вариант рони. Или то что изначально предложил liamas - это может быть эффективнее, если повторов немного и значения в основном уникальны.

MC-XOBAHCK 10.07.2018 11:21

Цитата:

Сообщение от Alexandroppolus (Сообщение 489268)
А много ли пунктов в массиве? Если много, то рекомендую вариант рони. Или то что изначально предложил liamas - это может быть эффективнее, если повторов немного и значения в основном уникальны.

Пунктов может быть по разному - генерируемое от задач (калькулятор). По идее не больше 100, обычно не более 2-ух десятков.

Если бы я умел так код как рони и liamas, я бы непременно воспользовался их вариантами. А так поднавалят решений где незнакомые мне методы, вроде ничего сложного, но я сразу в них теряюсь.

Хотя вот благодаря решениям выше, я смог освоить методы map, filter, reduce, sort. Пока правда только на цифровых массивах закрепил, но сейчас планирую c DOM этими методами поработать и немного переписать приложение. Идеи есть, пример мне liamas ещё в том году написал.

j0hnik 10.07.2018 13:19

MC-XOBAHCK,
Если хотите хорошо понять данные методы, напишите их аналоги.

вот например мап

function map(arr, fn){
	var newArr = [];
	for (var i = 0; i<arr.length; i++){
		 newArr.push(fn(arr[i]));
	}
	return newArr;
}


// функция для проверки
function fn(el){
	return el * 2;
}
var arr = [1,2,3,4,5];

console.log(map(arr, fn));


reduce и sort будут посложнее.


Часовой пояс GMT +3, время: 23:50.