Я должен создать функцию для сортировки строки чисел на основе «веса» каждого числа - «вес» - это цифры чисел, добавленных вместе (вес 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?

Благодарность!

5
joh04667 22 Дек 2015 в 00:26

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 с использованием лямбда-синтаксиса. Спасибо Стерлингу за предложение.

4
Will 21 Дек 2015 в 22:12

Решение с сортировкой с картой .

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
Nina Scholz 21 Дек 2015 в 22:36

Я хотел бы иметь массив индексов (0..n-1) и отсортировать его на основе массива весов (путем передачи функции сравнения, которая сравнивает веса для заданных значений индекса). Тогда у вас будет массив индексов, которые показывают, где должен быть каждый элемент (в вашем примере массив индексов будет [0, 2, 3, 1], что означает, что сначала должен быть arr [0], затем arr [2] и т. д. Теперь вы можете построить отсортированный массив, используя индексный массив, например [arr [0], arr [2], arr [3], arr [1]]. Итак, подведем итоги: получите входной массив, вычислите массив весов, создать индексный массив 0..n-1, отсортировать его на основе массива весов и, наконец, построить выходной массив на основе отсортированного индексного массива.

-1
gen-y-s 22 Дек 2015 в 09:27