Javascript:解析一个字符串,在字符串中找到相同的命名项,并将它们相加

Javascript:解析一个字符串,在字符串中找到相同的命名项,并将它们相加,javascript,Javascript,我有一个逗号分隔的字符串(它会变化,并不总是包含相同的数据),我需要找到所有相同的项目,然后对出现的数字进行计数。当从馈送中拉出字符串时,字符串将始终看起来像这样: 代数(2.50小时)、代数(2.50小时)、代数(2.50小时)、代数(2.50小时)、代数(2.50小时)、代数(6.50小时)、代数(2.50小时)、代数(2.50小时)、体育(出勤)(2.50小时)、体育(出勤)(2.50小时)、体育(出勤)(6.50小时)、体育(出勤)(2.50小时),田径(出勤)(2.50小时)、田径(出

我有一个逗号分隔的字符串(它会变化,并不总是包含相同的数据),我需要找到所有相同的项目,然后对出现的数字进行计数。当从馈送中拉出字符串时,字符串将始终看起来像这样:

代数(2.50小时)、代数(2.50小时)、代数(2.50小时)、代数(2.50小时)、代数(2.50小时)、代数(6.50小时)、代数(2.50小时)、代数(2.50小时)、体育(出勤)(2.50小时)、体育(出勤)(2.50小时)、体育(出勤)(6.50小时)、体育(出勤)(2.50小时),田径(出勤)(2.50小时)、田径(出勤)(2.50小时)、田径(出勤)(2.50小时)、田径(出勤)(2.50小时)、田径(出勤)(2.50小时)

我需要列出每种课程类型,如代数或体育(出勤),以及可能的学分总数。所以,在这个例子中,我最终需要一个变量,我可以显示它:“代数(26.50小时),运动(出勤)(26.50小时)。在这个特定的例子中,两个课程的时间是相同的,但情况并非总是如此

任何帮助都将不胜感激。

首先,请分开您的字符串。 var split=string.split(',')

创建一个数组。 var数组=[]

然后循环分割以获得所有值

for (var i=0;i<split.length;i++){
   array.push(split[i][0]);
  }
下一个循环通过唯一数组推送总值(需要循环中的一个循环)

var总计=[];
对于(var u=0;u

您可以这样做:

var s = "Algebra (2.50 hours), Algebra (2.50 hours), Algebra (2.50 hours), Algebra (2.50 hours), Algebra (2.50 hours), Algebra (2.50 hours), Algebra (6.50 hours), Algebra (2.50 hours), Algebra (2.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (6.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (2.50 hours)"
var splitResults = s.split(',');
var results = {};

for (var i = 0; i < splitResults.length; i++) {
    // Get the item name by looking for anything before the ( and stripping the extra space
    var item = splitResults[i].replace(/(.*?)\(.*/i, "$1").replace(/\s/g, '');

    // Get the item hours by finding the digit, including decimal point inside parenthesis
    var hours = splitResults[i].replace(/.*\(([0-9\.]+)\shours\)/i, "$1");

    // The iteem doesn't already exists in the struc
    if (results[item] === undefined) {
        results[item] = parseFloat(hours);
    }
    else {
        // Add the hours to the existing item
        results[item] += parseFloat(hours);
    }
}

// Outputs: Object {Algebra: 26.5, Athletic: 26.5}
console.log(results);
var s=“代数(2.50小时)、代数(2.50小时)、代数(2.50小时)、代数(2.50小时)、代数(2.50小时)、代数(6.50小时)、代数(2.50小时)、代数(2.50小时)、体育(出勤)(2.50小时)、体育(出勤)(2.50小时)、体育(出勤)(6.50小时)、体育(出勤)(2.50小时)、田径(出勤)(2.50小时)、田径(出勤)(2.50小时)、田径(出勤)(2.50小时)、田径(出勤)(2.50小时)、田径(出勤)(2.50小时)
var splitResults=s.split(',');
var结果={};
对于(var i=0;i
看看这个

var str = "Algebra (6.50 hours), Algebra (2.50 hours), Algebra (2.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (2.50 hours)";

var arr = str.split(",");
arr = arr.map(function(item,i,self){
    var object = item.trim();
  return {
    subj: object.split(" ")[0],
    time: object.split("").reverse().join("").split(" ")[1].split("").reverse().join("").split("(")[1]
  }
});



console.log(arr);

下面是一种方法,将每节课和总学时添加到无序列表中

请参见JSFIDLE示例:

var feedData=“代数(2.50小时)、代数(4.50小时)、代数(2.50小时)、代数(2.50小时)、代数(2.50小时)、代数(6.50小时)、代数(2.50小时)、代数(2.50小时)、代数(2.50小时)、体育(出勤)(5.50小时)、科学(2.25小时)、体育(出勤)(6.50小时)、体育(出勤)(2.50小时),阅读(2.50小时)、体育(出勤)(2.50小时)、历史(2.50小时)、历史(6.50小时)、体育(出勤)(2.50小时)”;
函数parseFeedData(数据){
var returnValue=“”;
var classes=新对象();
var splitItems=data.split(',');
$(拆分项)。每个(函数(索引、值){
var className=value.substring(0,value.lastIndexOf(“(”).trim();
var classHours=value.substring(value.lastIndexOf('(')),value.length.trim().split('')[0]。子字符串(1);
if(类[className]==null){
classes[className]=新对象();
类[className].name=className;
}
if(类[className].hours==null){
类[className].hours=0;
}
if(parseFloat(学时)!=NaN){
类[className].hours+=parseFloat(classHours);
}
});
for(类中的变量i){
$(“#classes”).append(“
  • ”+classes[i].name+”:“+classes[i].hours+“hours
  • ”) } } $(文档).ready(函数(){ 解析feedData(feedData); });
    到目前为止,你尝试了什么?你能给我们看什么代码吗?regex是你的朋友。顺便说一句,如果你能控制feed,请更改feed以提供可读的数据,而不是奇怪的字符串。编写一些代码来做这件事,然后在遇到问题时回来寻求帮助。很好。比我以前的方式简洁多了。你介意设置它吗在JSFIDLE中出现了什么?当我赋值给变量时,返回[object object]。工作得很好!非常感谢!
    Array.prototype.unique = function() {
        var arr = [];
        for(var i = 0; i < this.length; i++) {
            if(!arr.contains(this[i])) {
                arr.push(this[i]);
            }
        }
        return arr; 
    }
    
    var str = 'Algebra (2.50 hours), Algebra (2.50 hours), Algebra (2.50 hours), Algebra (2.50 hours), Algebra (2.50 hours), Algebra (2.50 hours), Algebra (6.50 hours), Algebra (2.50 hours), Algebra (2.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (6.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (2.50 hours)'
    str.split(',').map(function(s){
      return {
        hours: s.match(/\((\d\.\d)+.+\)$/)[1].trim(),
        title: s.match(/^(.+)\(/)[1].trim()
      };
    }).reduce(function(prev, current){
      if (!prev[current.title]) {
        prev[current.title] = 0;
      }
      prev[current.title] += parseFloat(current.hours);
      return prev;
    }, {})
    
    var s = "Algebra (2.50 hours), Algebra (2.50 hours), Algebra (2.50 hours), Algebra (2.50 hours), Algebra (2.50 hours), Algebra (2.50 hours), Algebra (6.50 hours), Algebra (2.50 hours), Algebra (2.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (6.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (2.50 hours)"
    var splitResults = s.split(',');
    var results = {};
    
    for (var i = 0; i < splitResults.length; i++) {
        // Get the item name by looking for anything before the ( and stripping the extra space
        var item = splitResults[i].replace(/(.*?)\(.*/i, "$1").replace(/\s/g, '');
    
        // Get the item hours by finding the digit, including decimal point inside parenthesis
        var hours = splitResults[i].replace(/.*\(([0-9\.]+)\shours\)/i, "$1");
    
        // The iteem doesn't already exists in the struc
        if (results[item] === undefined) {
            results[item] = parseFloat(hours);
        }
        else {
            // Add the hours to the existing item
            results[item] += parseFloat(hours);
        }
    }
    
    // Outputs: Object {Algebra: 26.5, Athletic: 26.5}
    console.log(results);
    
    var str = "Algebra (6.50 hours), Algebra (2.50 hours), Algebra (2.50 hours), Athletic (Attendance) (2.50 hours), Athletic (Attendance) (2.50 hours)";
    
    var arr = str.split(",");
    arr = arr.map(function(item,i,self){
        var object = item.trim();
      return {
        subj: object.split(" ")[0],
        time: object.split("").reverse().join("").split(" ")[1].split("").reverse().join("").split("(")[1]
      }
    });
    
    
    
    console.log(arr);
    
    var feedData="Algebra (2.50 hours), Algebra (4.50 hours), Algebra (2.50 hours), Algebra (2.50 hours), Algebra (3.50 hours), Algebra (2.50 hours), Algebra (6.50 hours), Algebra (2.50 hours), Algebra (2.50 hours), Athletic (Attendance) (5.50 hours), Science (2.25 hours), Athletic (Attendance) (6.50 hours), Athletic (Attendance) (2.50 hours), Reading (2.50 hours), Athletic (Attendance) (2.50 hours), History (2.50 hours), History (6.50 hours), Athletic (Attendance) (2.50 hours)";
    
    function parseFeedData(data){
        var returnValue = "";
        var classes = new Object();
        var splitItems = data.split(', ');
    
        $(splitItems).each(function(index,value){
             var className = value.substring(0,value.lastIndexOf('(')).trim();
             var classHours = value.substring(value.lastIndexOf('('),value.length).trim().split(' ')[0].substring(1);
    
            if (classes[className] == null){
                classes[className] = new Object();
                classes[className].name = className;
            }
    
            if (classes[className].hours == null){
                classes[className].hours = 0;
            }
    
            if (parseFloat(classHours) != NaN){
                classes[className].hours += parseFloat(classHours);
            }
        });
        for (var i in classes){
            $('#classes').append("<li>" + classes[i].name  + ": " + classes[i].hours + " hours</li>")
        }
    }
    
    $(document).ready(function(){
        parseFeedData(feedData);
    });