我有一个2D数组,其值为day和total:
val:[['02', 14487.97 ],
[ '03', 28230.21 ],
[ '05', 58017.5 ],
[ '08', 79214.96 ]]
我需要用最后一天的值填充缺少的日期。示例:
final: [[ '02', 14487.97 ],
[ '03', 28230.21 ],
[ '04', 28230.21 ],
[ '05', 58017.5 ],
[ '06', 58017.5 ],
[ '07', 58017.5 ],
[ '08', 79214.96 ],
-已编辑 我做了下面的代码,但不确定是否被优化。
arr =[['02', 14487.97 ],
[ '03', 28230.21 ],
[ '05', 58017.5 ],
[ '08', 79214.96 ]]
function zeroPad(num, places) {
var zero = places - num.toString().length + 1;
return Array(+(zero > 0 && zero)).join("0") + num;
}
init=parseInt(arr[0][0])
end=parseInt(arr[arr.length-1][0])
for (var i=init; i<end; i++) {
try {
if(arr[i]) {
if (arr[i][0] != zeroPad(i+1, 2)) {
var item = [zeroPad(i+1, 2), arr[i-1][1]];
arr.splice(i, 0, item);
}
}
else {
var item = [zeroPad(i+1, 2), arr[i-1][1]];
arr.splice(i, 0, item);
}
}
catch (e) {
console.log(arr[i]);
console.log(e);
break;
}
}
console.log(arr);
最诚挚的问候
答案 0 :(得分:0)
减速器可用于此类事情。这可行,并且不会更改原始数组(ES5语法):
var val = [
["02", 14487.97],
["03", 28230.21],
["05", 58017.5],
["08", 79214.96]
];
// zeroPad function borrowed from Stack Overflow somewhere...
function zeroPad (size, num){
var s = num + "";
while (s.length < size) {s = "0" + s;}
return s;
};
function fillMissingRows (acc, row){
function num (r){return parseInt(r[0]);}
var prev = acc[acc.length - 1] || [];
for (var i = 1; i < num(row) - num(prev); i++) {
acc.push([zeroPad(2, num(prev) + i), prev[1]]);
}
acc.push(row);
return acc;
};
console.log(val.reduce(fillMissingRows,[]));
/*
[
[ '02', 14487.97 ],
[ '03', 28230.21 ],
[ '04', 28230.21 ],
[ '05', 58017.5 ],
[ '06', 58017.5 ],
[ '07', 58017.5 ],
[ '08', 79214.96 ]
]
*/
约简函数fillMissingRows
依次获取val数组的每一行,并检查数组的前一行的索引号与当前行的索引号之间是否有间隙。如果存在,它将插入上一行的适当数量的副本(索引号已增加且零填充)到结果(acc
)中,然后再插入当前行并继续进行下一行行。
有关减少的详细信息,请参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce。
答案 1 :(得分:0)
我只是用循环来完成此版本,而不会丢失原始数组:
var data = [['02', 14487.97 ],
[ '03', 28230.21 ],
[ '05', 58017.5 ],
[ '08', 79214.96 ]];
function fillMissedRows(data){
var arr = [];
for(let i = 0; i <= data.length-1; i++){
arr.push(data[i]);
if(i < data.length-1){
if(Math.abs(data[i][0] - data[(i+1)%data.length][0]) > 1){
for(let j = parseInt(data[i][0], 10)+1; j < parseInt(data[(i+1)%data.length][0], 10); j++){
var res = [(j+"").length > 1 ? j+"" : "0"+j, data[i][1]];
arr.push(res);
}
}
}
}
return arr;
}
console.log(fillMissedRows(data));