在javascript中的2D数组中填充缺失值

时间:2020-07-07 18:05:10

标签: javascript arrays

我有一个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);

最诚挚的问候

2 个答案:

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