Javascript using reduce function

I have the following array

 ["0,5,p1", "24,29,p2", "78,83,p2", "78,83,p3", "162,167,p2" ] 

      

I need the output as ["5,p1","10,p2","5,p3"]

, so p1..3 are pay time video files with start and end time. 0.5 p1 medium profile played for 5 seconds, etc. I want to find out how long the total time takes, using an ECMA map script, reduce a function. Here's what I tried but it doesn't work:

 var ca =   uniqueArray.reduce(function(pval, elem) {
    var spl = elem.split(',');
            var difference = Math.round(spl[1] - spl[0]);
            return difference;
    },elem.split(',')[3]);

      

+3


source to share


4 answers


I don't think it can be done in a single pass, but I could be wrong. I would go 2 steps ...

  • Shrink the array to get a unique map of pX values
  • Return the result back to an array in the required format


var input = ["0,5,p1", "24,29,p2", "78,83,p2", "78,83,p3", "162,167,p2" ] 

var step1 = input.reduce(function(p,c){
    var parts = c.split(",");
    if(!p[parts[2]])
       p[parts[2]] = 0;
    p[parts[2]] += parseInt(parts[1],10) - parseInt(parts[0],10);
    return p;
},{});

var result = Object.keys(step1).map(function(e){
    return step1[e] + "," + e;
});

console.log(result);
      

Run codeHide result


+6


source


You can use es6 map:



arrayWithNumbers.map(a => {var spl = a.split(','); return (spl[1] - spl[0]) + "," + spl[2]})

      

+1


source


For a one-loop approach, you can use a hash table for the same third parts, eg 'p1'

. If a hash is specified, update the value with the actual delta.

var array = ["0,5,p1", "24,29,p2", "78,83,p2", "78,83,p3", "162,167,p2"],
    hash = Object.create(null),
    result = array.reduce(function(r, a) {
        var parts = a.split(','),
            delta = parts[1] - parts[0],
            key = parts[2];

        if (!(key in hash)) {
            hash[key] = r.push([delta, key].join()) - 1;
            return r;
        }
        r[hash[key]] = [+r[hash[key]].split(',')[0] + delta, key].join();
        return r;
    }, []);

console.log(result);
      

Run codeHide result


+1


source


I have updated the code. Please check now.

    var ca =   ["0,5,p1", "24,29,p2", "78,83,p2", "78,83,p3", "162,167,p2" ] .reduce(function(result, elem) {
        var spl = elem.split(',');
        var difference = Math.round(spl[1] - spl[0]);
        var found = false 
        for (var i = 0 ; i < result.length; i++) {
          if (result[i].split(',')[1] == spl[2]) {
            result[i] = parseInt(result[i].split(',')[0]) + difference+","+spl[2]; 
            found = true;
          }
        }
        if (!found) result.push(difference+","+spl[2]);       
        return result;
        },[]);
        
     console.log("modified array",ca);
      

Run codeHide result


0


source







All Articles