2015-08-18 3 views
0

Я пытаюсь найти вызов на веб-сайте обучения JavaScript.Преобразование строки Javascript и сортировка массива

Инструкции:

Было решено приписать «вес» к номерам. Вес номера будет теперь от суммы его цифр. Например, 99 будет иметь «вес» 18, 100 будет иметь «вес» 1, поэтому в списке 100 будет до 99. С учетом строки с веса членов FFC в нормальный порядок вы можете дать эту строку, заказанную «весами» этих номеров?

Пример: а = "56 65 74 100 99 68 86 180 90" по заказу чисел весов становится: "100 180 90 56 65 74 68 86 99" Когда два числа имеют один и тот же "вес", давайте классифицируйте их так, как если бы они были строками, а не номерами: 100 до 180, потому что его «вес» (1) меньше, чем один из 180 (9) и 180 - до 90, поскольку с тем же «весом» (9) это предшествует как строка. Все номера в списке положительные номеров, и список может быть пустым.

Моя попытка ниже:

function orderWeight(strng) { 
 

 
    console.log(strng); 
 
    if (strng === "") { 
 
    return strng; 
 
    } else { 
 
    var arr = strng.split(" ").sort(); 
 
    console.log(arr); 
 
    var keys = []; 
 

 
    for (var i = 0; i < arr.length; i++) { 
 
     var weight = 0; 
 
     var current = arr[i]; 
 
     //loop through the array adding the digits of each number 
 
     for (var j = 0; j < arr[i].length; j++) { 
 
     var sNum = parseInt(arr[i].charAt[j]); 
 
     weight += sNum; 
 
     console.log(weight); 
 
     } 
 
     keys.push({ 
 
     weight: weight, 
 
     number: current 
 
     }); 
 
     console.log(keys); 
 
    } 
 
    } 
 
};

Выход из моего кода:

input string "103 123 4444 99 2000" 
console.log(arr); = [ '103', '123', '2000', '4444', '99' ] 
console.log(weight); = NaN 

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

+0

Просто любопытство. Я попробовал, это правильно? http://jsfiddle.net/umdg3h9z/ – blex

ответ

5

Вы используете скобки вместо скобок при вызове charAt.

Изменить это:

var sNum = parseInt(arr[i].charAt[j]); 

к:

var sNum = parseInt(arr[i].charAt(j)); 
2

Вычислить вес каждой строки путем преобразования его в целое число и принимает сумму цифр:

var weight = 0, 
    x = parseInt(parts[i], 10); 
while (x != 0) { 
    var digit = x % 10; 
    weight += digit; 
    x = (x - digit)/10; 
} 

Затем сделать объекты, которые содержат каждое значение и строку оно пришло от:

sorted[i] = { weight: weight, string: parts[i] }; 

Теперь вы можете sort the objects с функцией сравнения, которая использует веса, если они отличаются, и standard string comparison иначе:

sorted.sort(function (a, b) { 
    if (a.weight != b.weight) { 
    return a.weight - b.weight; 
    } 
    return a.string.localeCompare(b.string); 
}); 

Наконец, извлеките строки и распечатайте их, чтобы показать результат.

Демонстрация:

function print(s) { 
 
    document.write(s + '<br />'); 
 
} 
 

 
function solve(s) { 
 
    print('input: ' + s); 
 
    var parts = s.split(' '), 
 
     n = parts.length, 
 
     sorted = new Array(n); 
 
    for (var i = 0; i < n; ++i) { 
 
    var weight = 0, 
 
     x = parseInt(parts[i], 10); 
 
    while (x != 0) { 
 
     var digit = x % 10; 
 
     weight += digit; 
 
     x = (x - digit)/10; 
 
    } 
 
    sorted[i] = { weight: weight, string: parts[i] }; 
 
    } 
 
    sorted.sort(function (a, b) { 
 
    if (a.weight != b.weight) { 
 
     return a.weight - b.weight; 
 
    } 
 
    return a.string.localeCompare(b.string); 
 
    }); 
 
    var newParts = new Array(n); 
 
    for (var i = 0; i < n; ++i) { 
 
    newParts[i] = sorted[i].string; 
 
    } 
 
    print('output: ' + newParts.join(' ')); 
 
} 
 

 
solve("56 65 74 100 99 68 86 180 90");

1

Я бы сделать функцию для вычисления весов затем использовать custom sort function отсортировать массив.

Вот пример работы.

var input = "56 65 74 100 99 68 86 180 90"; 
 
var a = input.split(" "); 
 
a.sort(function(x, y) { 
 
    var xWeight = getWeight(x); 
 
    var yWeight = getWeight(y); 
 
    if (xWeight === yWeight) 
 
    return x > y; 
 
    else 
 
    return xWeight > yWeight; 
 
}); 
 

 
function getWeight(x) { 
 
    var weight = 0; 
 
    var arr = x.split(""); 
 
    arr.forEach(function(i) { 
 
    weight += parseInt(i, 10); 
 
    }); 
 
} 
 

 
console.log(a);