javascript 使用 reduce 函数
javascript using reduce function
我有下面的数组
["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]);
你可以使用 es6 地图:
arrayWithNumbers.map(a => {var spl = a.split(','); return (spl[1] - spl[0]) + "," + spl[2]})
我不认为它可以一次性完成,但我可能是错的。我会走两步...
- 缩减数组以获得 pX 值的唯一映射
- 将结果映射回所需格式的数组
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);
对于单循环方法,您可以对相同的第三部分使用散列 table,例如 '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);
我更新了代码。请现在检查。
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);
我有下面的数组
["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]);
你可以使用 es6 地图:
arrayWithNumbers.map(a => {var spl = a.split(','); return (spl[1] - spl[0]) + "," + spl[2]})
我不认为它可以一次性完成,但我可能是错的。我会走两步...
- 缩减数组以获得 pX 值的唯一映射
- 将结果映射回所需格式的数组
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);
对于单循环方法,您可以对相同的第三部分使用散列 table,例如 '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);
我更新了代码。请现在检查。
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);