Сортировка массива по значениям
Есть массив из чисел:
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 и др. но у меня в практике пока самые простые применения. Поэтому я ещё туго соображаю как это работает. А вот как раз появилась задачка и хотелось бы увидеть как правильно делают решение. Со склонением падежей слова штук проблем нет, я знаю как это сделать и внедрить. |
Сначала сортируем, а затем выборка с припиской.
|
Методы сортировки я нашёл в учебнике: https://learn.javascript.ru/array-me...of-lastindexof
сижу пробую, изучаю. Что числа сортируются по первым цифрам - это я понял. Нужно писать свою функцию для arr.sort(compareNumeric); Я такого не делал, поэтому у меня пока нет идей с построением логики. Но думаю они появятся, ещё погуглю. А вот с группировкой значений - вообще темнота. |
Цитата:
|
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); |
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>
|
Цитата:
Процесс штрипсования тонколистового металла (если что). Более понятный пример по аналогии - листики A4 разрезать вдоль на визитки. Визитки 4-х вариантов: стандарт, супер-биг, мини и микро (в общем разных размеров). Режим листик А4 на супер-биг визитки - получается остаток из которого можно нарезать других видов визиток. Поэтому нужно обрезки собрать и пустить тут же в дело, чтобы сэкономить листиков А4. Как то так, только листики 2000 х 1250 мм. j0hnik, рони СПАСИБО! Мне на вскидку понятнее вариант j0hnik. Разобью на части, посмотрю как поэтапно работают скрипты. Возможно промежуточные этапы мне понадобятся как отдельные значения. |
Цитата:
|
Цитата:
Если бы я умел так код как рони и liamas, я бы непременно воспользовался их вариантами. А так поднавалят решений где незнакомые мне методы, вроде ничего сложного, но я сразу в них теряюсь. Хотя вот благодаря решениям выше, я смог освоить методы map, filter, reduce, sort. Пока правда только на цифровых массивах закрепил, но сейчас планирую c DOM этими методами поработать и немного переписать приложение. Идеи есть, пример мне liamas ещё в том году написал. |
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 будут посложнее. |
Цитата:
То я с предыдущим ответом затянул из за того что полез смотреть как рекомендуют оформлять комменты в коде https://learn.javascript.ru/coding-s...80%D0%B8%D0%B8 и в итоге поставил себе JSDOC. Пока gulp поправил под каждую папку внутри проекта, пока конфиги с шаблоном подогнал, получилась пауза на пару дней. |
<script>
var next = [170,170,170,170,170,890,130,130,130,260].sort().reduce((arr, curr, idx, initArr) => {
!(curr in arr) ? arr[curr] = 1 : arr[curr]++
return arr;
}, {})
console.log(next)
</script>
|
SuperZen,
в чём смысл сортировки? |
рони, в данном случае ни в чем
вот еще пример:
<script>
var next = ["e","a","a","a","a","b","c","c","c","d"].sort().reduce((arr, curr, idx, initArr) => {
!(curr in arr) ? arr[curr] = 1 : arr[curr]++
return arr;
}, {})
console.log(next)
</script>
здесь сорт уже имеет смысл |
SuperZen,
а тут зачем sort() ? |
SuperZen,
в объекте порядок свойств, это только визуальный эффект |
Цитата:
|
Alexandroppolus,
Цитата:
|
Alexandroppolus,
<script>
var arr = { 1: 'b', 0: 'a' }
for (a in arr) {
console.log(a)
}
//0 1
</script>
|
| Часовой пояс GMT +3, время: 23:43. |