JavaScript使用reduce函数

3

我有以下数组

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

我希望输出为["5,p1","10,p2","5,p3"],因此p1..3是视频文件的开始和结束时间。0,5表示p1个人资料播放了5秒,依此类推。我想使用ECMA脚本map、reduce函数来知道每个个人资料总共花费了多少时间。以下是我的尝试,但它不起作用:

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

2
这不是 15,p2 吗? - Serge K.
是的,我想我错过了它...谢谢。 - Mohit H
4个回答

6
我不认为这可以一步完成,但我可能是错的。我会采取两步:
  1. 缩小数组以获得唯一的 pX 值的映射
  2. 将结果映射回所需格式的数组

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);


1
你可以使用ES6中的Map:
arrayWithNumbers.map(a => {var spl = a.split(','); return (spl[1] - spl[0]) + "," + spl[2]})

它并不完全满足。操作需要将相同的参数值添加到数组中。 - prasanth
@Jamiec 我得到了 ["5,p1", "5,p2", "5,p2", "5,p3", "5,p2"] - 这不是他想要的吗? - Ben Taliadoros
1
@BenTaliadoros 不是的。看一下问题。他基本上是按 pX 进行分组和求和。 - Jamiec

1
对于单循环方法,您可以使用哈希表来处理相同的第三方部分,例如'p1'。如果给定哈希值,则使用实际增量更新该值。

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);


0

我已经更新了代码,请现在检查一下。

    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);


有人在评论中提到了运行代码的位置。您需要点击“运行代码片段”并查看答案。如果有其他期望,请在评论中发表,以便我提供帮助。 - Kannan J
请参阅原始帖子以了解期望,但您未达到它们:/ - Serge K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接