В javascript, я могу создать функцию сортировки, которая помещает верхние 10 счетчиков сверху, отсортированные по алфавиту?
У меня есть набор цветов и количество продуктов, найденных в этом цвете:
[
{colour: 'red', count: 100},
{colour: 'green', count: 30},
{colour: 'blue', count: 80},
...
]
Список намного длиннее, чем этот. Я хочу:
- чтобы показать лучшие десять цветов с наибольшим количеством в верхней части списка,
- но отсортируйте эти 10 лучших по алфавиту.
Я могу использовать только JS CompareFunction, один раз. Есть ли способ добиться этого?
Кроме того, я пытаюсь получить этот результат сортировки при использовании уточняющего списка библиотеки Algolia InstantSearch. Как задокументировано, sortBy может принимать только одну функцию сортировки. Если у кого-то есть другое решение для этого, то этого, конечно, также будет достаточно.
Я довольно удивлен стремлением людей дать ответы, которые не соответствуют требованиям. Независимо от варианта использования, мне кажется интересной проблемой найти решение.
6 ответов
Это будет сортировать независимо от количества после определения лучших 'n' записей. Таким образом, упорядоченный по убыванию, он будет затем повторно отсортирован в этом нарезанном массиве, используя свойство объекта второго динамического массива colour
заказать по алфавиту:
// example array:
const Arr = [
{colour: 'blue', count: 10},
{colour: 'red', count: 100},
{colour: 'red', count: 101},
{colour: 'green', count: 30},
{colour: 'green', count: 40},
{colour: 'blue', count: 100},
{colour: 'white', count: 40},
{colour: 'orange', count: 40}
];
// multiple sort function:
const orderedCollection = (arr, n, ...props) => {
return arr
// create a copy of the array
.slice(0)
// sort by descending order i.e "count"
.sort((a, b) => b[props[0]] - a[props[0]])
// take 'n' number of records i.e 5
.slice(0, n)
// sort alphabetically (a-z), based on property i.e "colour"
.sort((a, b) => {
if (a[props[1]] < b[props[1]]) return -1;
if (a[props[1]] > b[props[1]]) return 1;
return 0;
});
};
// top 5, using props count & colour.
orderedCollection(Arr, 5, "count", "colour")
.forEach((obj, index) => {
// example output:
console.log(`${index +1}. ${obj.colour} - ${obj.count}`);
});
Шаг 1: Используйте метод Array.sort()
сортировка элементов массива (объектов) по их количеству (по убыванию). Вот функция сравнения, которая делает это :
var sortByCount = jsonObj.sort(function(a, b) {
return b.count - a.count;
});
Вот, jsonObj
это исходный массив объектов, который unsorted
,
Шаг 2: Используйте Array.slice(), чтобы получить 10 лучших записей из отсортированного массива
Синтаксис: array.slice(start, end)
var sortByCount = jsonObj.sort(function(a, b) {
return b.count - a.count;
});
var topTen = sortByCount.slice(0,10);
Шаг 3: Снова отсортируйте первые 10 записей по алфавиту в порядке возрастания.
var sortByCount = jsonObj.sort(function(a, b) {
return b.count - a.count;
});
var topTen = sortByCount.slice(0,10);
var sortByName = topTen.sort(function(a, b) {
if(a.colour < b.colour) return -1;
if(a.colour > b.colour) return 1;
return 0;
});
Рабочая Демо
var jsonObj = [
{colour: 'red', count: 100},
{colour: 'green', count: 30},
{colour: 'zlue', count: 40},
{colour: 'dlue', count: 90},
{colour: 'ylue', count: 20},
{colour: 'blue', count: 25},
{colour: 'jlue', count: 45},
{colour: 'klue', count: 2556},
{colour: 'slue', count: 46},
{colour: 'xlue', count: 745},
{colour: 'qlue', count: 76},
{colour: 'tlue', count: 65}
];
var sortByCount = jsonObj.sort(function(a, b) {
return b.count - a.count;
});
var topTen = sortByCount.slice(0,10);
var sortByName = topTen.sort(function(a, b) {
if(a.colour < b.colour) return -1;
if(a.colour > b.colour) return 1;
return 0;
});
console.log(sortByName);
Вы можете использовать двухпроходный стиль для получения первых верхних значений и порядка, в котором массив будет верхним значением и по алфавиту.
Результат содержит все элементы, десять главных элементов первой части, упорядоченные name
а остальное тоже упорядочено по имени, но не по первому.
var data = [{ colour: 'red', count: 100 }, { colour: 'green', count: 30 }, { colour: 'blue', count: 80 }, { colour: 'white', count: 40 }, { colour: 'black', count: 5 }, { colour: 'pink', count: 8 }, { colour: 'yellow', count: 99 }, { colour: 'cyan', count: 37 }, { colour: 'magenta', count: 32 }, { colour: 'grey', count: 23 }, { colour: 'mint', count: 13 }, { colour: 'brown', count: 18 }, { colour: 'orange', count: 1 }, { colour: 'x', count: 0 }, { colour: 'b', count: -1 }, { colour: 'a', count: -2 }, { colour: 'y', count: -4 }],
count = data.reduce(function (r, a, i) {
var min;
if (r.length < 10) {
return r.concat(a.count);
}
min = Math.min(...r);
if (a.count > min) {
r[r.indexOf(min)] = a.count;
}
return r;
}, []);
data.sort(function (a, b) {
return count.includes(b.count) - count.includes(a.count) || a.colour.localeCompare(b.colour);
});
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }
var arr = [
{colour: 'red', count: 100},
{colour: 'green', count: 30},
{colour: 'blue', count: 80},
{colour: 'red', count: 17},
{colour: 'green', count: 50},
{colour: 'blue', count: 8},
{colour: 'red', count: 16},
{colour: 'green', count: 45},
{colour: 'blue', count: 35},
{colour: 'red', count: 15},
{colour: 'green', count: 25},
{colour: 'blue', count: 20},
{colour: 'red', count: 10},
{colour: 'green', count: 40},
{colour: 'blue', count: 70}
]
arr.sort(function(a, b) {
return b['count'] - a['count'];
})
arr.splice(10)
arr.sort(function(a, b) {
var nameA = a.colour.toUpperCase(); // ignore upper and lowercase
var nameB = b.colour.toUpperCase(); // ignore upper and lowercase
if (nameA < nameB) {
return -1;
}
if (nameA > nameB) {
return 1;
}
// names must be equal
return 0;
});
console.log(arr);
Это должно дать некоторое представление о том, как вы можете сортировать пользовательские массивы. если вы поменяете местами a и b, вы разберетесь в противоположном направлении.
да, я знаю, что вы сказали, что хотите использовать только один вызов функции сравнения, но, честно говоря... если проф заставляет вас сделать это, вы можете подумать о переключении курсов или заставить его понять, что его идиология глупа для практического использования,
в конце концов, stackru не предназначен для ответа на вопросы, которые не имеют отношения к неэффективным сценариям использования.
[
{colour: 'red', count: 100},
{colour: 'green', count: 30},
{colour: 'blue', count: 80},
{colour: 'pink', count: 1337},
{colour: 'black', count: 10},
{colour: 'orange', count: 101}
]
// sort by count
.sort((a, b) => b.count - a.count)
// extract first three colours
.splice(0, 3)
// sort by text
.sort((a, b) => a.colour > b.colour ? 1 : a.colour < b.colour ? -1 : 0)
// print the result into the console
.forEach((x, i) => console.log(`${['first', 'second', 'third'][i]}: ${x.colour}`));
Для этого сначала вам нужно использовать функцию сортировки массива по числу (числа), а затем по цвету (текст). Чтобы получить верхние данные, вы можете использовать массив ломтик. Просто обратитесь к основным функциям JavaScript и попробуйте сами. Смотрите ниже код:
<script type="text/javascript">
var colorsarray = [
{colour: 'red', count: 100},
{colour: 'green', count: 30},
{colour: 'blue', count: 80},
{colour: 'yellow', count: 60},
{colour: 'purple', count: 50},
{colour: 'pink', count: 10},
{colour: 'brown', count: 90},
{colour: 'black', count: 70},
{colour: 'white', count: 20},
{colour: 'gold', count: 110},
{colour: 'silver', count: 150},
{colour: 'orange', count: 130},
{colour: 'grey', count: 40},
];
colorsarray.sort(function(a, b){
return a.count-b.count
});
colorsarray.sort(function(a, b){
var name1=a.colour.toLowerCase(),
var name2=b.colour.toLowerCase(),
if (name1 < name2)
return -1
if (name1 > name2)
return 1
return 0
});
console.log(colorsarray.slice(1,10));
</script>