Javascript字符串转换和数组排序

时间:2015-08-18 21:01:50

标签: javascript arrays string sorting

我正在JavaScript学习网站上尝试挑战。

说明如下:

  

决定归因于"体重"数字。一个人的重量   数字将从现在起数字的总和例如99将   有重量" 18,100将有"体重" 1所以在列表100将   来自99.给出一个字符串,其中包含FFC成员的权重   正常的顺序你能给这个字符串排序"权重"这些   号码?

     

实施例:        a =" 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);
    }
  }
};
&#13;
&#13;
&#13;

我的代码的输出是:

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

我意识到在我让这部分代码工作之后我需要做更多的工作,但是如果有人能指出我的方向让这部分去做我想做的事我会非常感激。

4 个答案:

答案 0 :(得分:5)

调用charAt时,您使用括号而不是括号。

改变这个:

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

为:

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

答案 1 :(得分: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);
});

最后,提取字符串并打印它们以显示结果。

演示:

&#13;
&#13;
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");
&#13;
&#13;
&#13;

答案 2 :(得分:1)

我创建了一个计算权重的函数,然后使用custom sort function对数组进行排序。

这是一个正在运行的例子。

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 3 :(得分:0)

可以按照以下方式进行:

function getWeight(string){
  return eval(string.split('').join('+'))
}

function orderWeight(string){
  return string.split(' ').sort(function(a,b){
    var wA = getWeight(a), wB = getWeight(b);
    if(wA>wB) return 1;
    if(wA<wB) return -1;
    if(a>b)   return 1;
    if(a<b)   return -1;
    return 0;
  }).join(' ');
}