Я должен создать функцию для сортировки строки чисел на основе «веса» каждого числа - «вес» - это цифры чисел, добавленных вместе (вес 99 будет 18, вес 100 будет 1 и т. Д.) Это означает, что строка "100 54 32 62"
вернет "100 32 62 54"
.
Я могу получить массив весов этих чисел, просто используя:
function orderWeight(str) {
var arr = str.split(" ");
var sortArr = [];
arr.forEach(t => sortArr.push(t.split("").map(s => parseInt(s, 10)).reduce(add, 0)));
}
Где add
- это просто общая функция сложения. Для приведенного выше примера sortArr
будет [1, 9, 5, 8]
.
Как лучше всего отсортировать массив исходных чисел из строки arr
на основании того, как сортируется новый массив весов чисел sortArr
?
Благодарность!
3 ответа
Это должно помочь:
var x = '100 54 32 62';
function orderWeight(str) {
return str.split(' ').sort(function(a, b) {
return (a.split('').reduce(function(p, c) { return +p + +c; })) > (b.split('').reduce(function(p, c) { return +p + +c; }));
}).join(' ');
}
var result = orderWeight(x);
Выход:
100 32 62 54
ОБНОВИТЬ:
Согласно предложению Стерлинга, здесь та же функция, написанная в лямбда-формате.
var x = '100 54 32 62';
function orderWeight(str) {
return str.split(' ').sort((a, b) => a.split('').reduce((p, c) => +p + +c) > b.split('').reduce((p, c) => +p + +c)).join(' ');
}
var result = orderWeight(x);
Примечание: я впервые пишу Javascript с использованием лямбда-синтаксиса. Спасибо Стерлингу за предложение.
Решение с сортировкой с картой .
function sort(string) {
var array = string.split(' '),
mapped = array.map(function (a, i) {
return { index: i, value: +a.split('').reduce(function (a, b) { return +a + +b; }) };
});
return mapped.sort(function (a, b) {
return a.value - b.value;
}).map(function (a) {
return array[a.index];
}).join(' ');
}
document.write('<pre>' + JSON.stringify(sort('100 54 32 62'), 0, 4) + '</pre>');
Я хотел бы иметь массив индексов (0..n-1) и отсортировать его на основе массива весов (путем передачи функции сравнения, которая сравнивает веса для заданных значений индекса). Тогда у вас будет массив индексов, которые показывают, где должен быть каждый элемент (в вашем примере массив индексов будет [0, 2, 3, 1], что означает, что сначала должен быть arr [0], затем arr [2] и т. д. Теперь вы можете построить отсортированный массив, используя индексный массив, например [arr [0], arr [2], arr [3], arr [1]]. Итак, подведем итоги: получите входной массив, вычислите массив весов, создать индексный массив 0..n-1, отсортировать его на основе массива весов и, наконец, построить выходной массив на основе отсортированного индексного массива.
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.