首页 > 解决方案 > 在javascript中填充二维数组中的缺失值

问题描述

我有一个二维数组,其中包含值天和总计:

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

最好的祝福

标签: javascriptarrays

解决方案


减速器对这种事情很有用。这有效,并且不会更改原始数组(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) 中,其索引号增加并填充零,然后再插入当前行并移动到下一行。

有关 reduce 的详细信息,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce


推荐阅读