嘿,将字符串解析为字符,将字符串解析为数字

时间:2016-03-20 17:03:17

标签: javascript parsing object

根据所有学生成绩的报告,返回班级平均成绩和每个学生的平均成绩。

参数: " Tom 91 85 115 100 99 \ nTim 98 111 98 91 95 \ nThomas 100 98 97 94 99"

输出 {&#34; all&#34;:98.06,&#34; Tom&#34;:98,&#34; Tim&#34;:98.6,&#34; Thomas&#34;:97.6} < / p>

我无法将字符串中的字符和数字分开。我需要动态地吐出所有学生的总平均值,并以对象形式自己平均每个学生的平均值(参见上面的粗体)。因此,如果有任何活动,它将适用于10或2名学生。以下是我的代码

function gradeCalulator (grades) {

  var arrayReport = report.split("\n");
  var i, j, results = {}; var array = []; 
  var alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  var numbers = "0123456789"
  for(i = 0; i < arrayReport.length; i++){
    for(j = 0; j < arrayReport[i].length; j++){
         if(alpha.indexOf(arrayReport[i][j]) > 0 ){
                results[arrayReport[i][j]] = arrayReport[i][j]
         } else if(numbers.indexOf(arrayReport[i][j]) > 0){
                results[arrayReport[i][j]] = arrayReport[i][j]
         }
      } 

  }
return results

}
gradeCalulator("Tom 91 85 115 100 99\nTim 98 111 98 91 95\nThomas 100 98 97 94 99");

4 个答案:

答案 0 :(得分:0)

这样做可以解决你的问题

function gradeCalulator (reports)
{
    var students = grades.split('\n');
    var avg= {};

    var classsum = 0;
    for(var i in students)
    {
        var grades = students[i].split(' ');
        var sumgrade = 0;
        for(var j = 1; j < grades.length; j++) sumgrade+= parseInt(grades[j]);
        avg[grades[0]] = sumgrade / (grades.length - 1);
        classsum += avg[grades[0]];
    }

    avg.all = classsum / (students.length+1)
    return avg;
}

gradeCalulator("Tom 91 85 115 100 99\nTim 98 111 98 91 95\nThomas 100 98 97 94 99");

答案 1 :(得分:0)

试一试:

&#13;
&#13;
var report = "Tom 91 85 115 100 99\nTim 98 111 98 91 95\nThomas 100 98 97 94 99";

var a = report.split('\n');

var result = {};
var sum = 0;
var st;

a.forEach(function(e) {
    st = e.split(' ');
    var name = st.shift();
    var s = 0;
    st.forEach(e => s += +e);
    sum += s;
    result[name] = s / st.length;
});

result.all = +(sum / a.length / st.length).toFixed(2);

document.write(JSON.stringify(result));
&#13;
&#13;
&#13;

答案 2 :(得分:0)

使用String.splitArray.foreachArray.reduceArray.slice函数的解决方案:

function gradeCalulator(grades) {
    var arrayReport = grades.split("\n"), result = {}, items, allAvg = 0;
    arrayReport.forEach(function(v){
        items = v.split(' ');
        result[items[0]] = (items.slice(1).reduce(function(a,b){ return parseInt(a) + parseInt(b); }))/(items.length - 1);
        allAvg += result[items[0]];
    });
    result['all'] = parseFloat((allAvg/Object.keys(result).length).toFixed(2));
    return result;
}

var result = gradeCalulator("Tom 91 85 115 100 99\nTim 98 111 98 91 95\nThomas 100 98 97 94 99");

console.log(result);
// Object {Tom: 98, Tim: 98.6, Thomas: 97.6, all: 98.07}

答案 3 :(得分:0)

使用reduce

var list =  str.split('\n');

var sumInts = function (a, b) { return +a + +b; }
var toTwoDecimal = function (num) {
  return +parseFloat(Math.round(num * 100) / 100).toFixed(2);
}

function getGrades(arr) {
  var all = 0;
  var people = arr.reduce(function (p, c) {
    var person = c.split(' ');
    var nums = person.slice(1);
    var sum = nums.reduce(sumInts) / nums.length;
    p[person[0]] = sum;
    all += sum;
    return p;
  }, {});
  people.all = toTwoDecimal(all / arr.length);
  return people;
}

getGrades(list); // { Tom: 98, Tim: 98.6, Thomas: 97.6, all: 98.07 }

DEMO