Javascript用中间值填充数组

标签 javascript arrays multidimensional-array fill missing-data

我正在尝试用缺失的中间数据填充数组

我的数据输入是这样的

var data = [[5.23,7],[5.28,7],[5.32,8],[5.35,8]];

我想用缺失值填充数组,但我需要遵守此规则:

  1. 二维数组上的第一个值必须是下一个序列号,因此 5.23 ... 5.24 ... 5.25 ...
  2. 二维数组中的第二个值必须与 i+1 中的元素相同 值

所以这种情况下的结果是

var data = [[5.23,7],[5.24,7],[5.25,7],[5.26,7],[5.27,7],[5.28,7],[5.29,8],[5.30,8],[5.31,8],[5.32,8],[5.33,8],[5.34,8],[5.35,8]];

这段小代码可以工作,但我不知道 如何放入循环 以及如何编写每次传递数组新长度的 while 循环

var data = [[5.23,7],[5.28,7],[5.32,8],[5.35,8]];

if (data[1][0]-data[0][0] > 0.01) {
    data.push([data[0][0]+0.01,data[1][1]]);
    data.sort(function (a, b) { return a[0] - b[0]; });
} else {
    check the next element
}

console.log(数据);

有什么想法吗?

最佳答案

这是另一个想法...我认为直接循环序列号可能感觉更自然。

最终数组的范围(在本示例中)从 5.23 到 5.35,增量为 0.01。此方法使用 for 循环,从 5.23 开始到 5.35,递增 0.01。

要点

  • 舍入:以 x100 计算,然后再向下除以避免浮点舍入问题。 我使用 toFixed(2) 四舍五入到接近百分之一,然后转换回数字(带有前导 + 运算符)。
  • 索引:认识到 5.23 是零索引,每个索引递增 1/100,您可以根据数值计算索引,例如: 100*(5.31-5.23)等于 8 (所以 5.31 属于 output[8] )。
  • 第二个值:给定一个数值(例如 5.31 ),只需找到数据数组中第一个值较高的第一个元素并使用其第二个值 - 这是以下推论您的要求。因为5.31 <= 5.28为 false,请勿使用 7 (来自[5.28,7])。因为5.31 <= 5.32为真,请使用8 (来自[5.32,8])。

编辑

我稍微改进了性能 - (1) 初始化输出而不是修改数组大小,(2) 以 100 的倍数工作而不是从浮点连续舍入到百分之一。

我在一个较长的示例上运行了 5000 次迭代,平均而言,这些修改使该方法比 Redu 的方法快3 倍(原始方法慢 2 倍)。

var data = [[5.23,7],[5.28,7],[5.32,8],[5.35,8]];

var output = Array((data[data.length-1][0]-data[0][0]).toFixed(2)*100+1)

function getIndex(value){
   return (value-data[0][0]*100)
}
  
for( var i = 100*data[0][0]; i <= 100*data[data.length-1][0]; i++ ){
  output[getIndex(i)] = [i/100, data.find( d => i <= 100*d[0] )[1]]
}

//console.log(output)





// Performance comparison
function option1(data){
  let t = performance.now()

  var output = Array((data[data.length-1][0]-data[0][0]).toFixed(2)*100+1)

  function getIndex(value){
     return (value-data[0][0]*100)
  }
  
  for( var i = 100*data[0][0]; i <= 100*data[data.length-1][0]; i++ ){
    output[getIndex(i)] = [i/100, data.find( d => i <= 100*d[0] )[1]]
  }

  return performance.now()-t
}

function option2(data){
  let t = performance.now()
  
  newData = data.reduce((p,c,i,a) => i ? p.concat(Array(Math.round(c[0]*100 - a[i-1][0]*100)).fill()
                                                                                            .map((_,j) => [Number((a[i-1][0]+(j+1)/100).toFixed(2)),c[1]]))
                                      : [c],[]);
  return performance.now()-t
}

var testdata = [[1.13,4],[2.05,6],[5.23,7],[5.28,7],[5.32,8],[5.35,8],[8.91,9],[10.31,9]];
var nTrials = 10000;

for(var trial=0, t1=0; trial<=nTrials; trial++) t1 += option1(testdata)
for(var trial=0, t2=0; trial<=nTrials; trial++) t2 += option2(testdata)

console.log(t1/nTrials) // ~0.4 ms
console.log(t2/nTrials) // ~0.55 ms

关于Javascript用中间值填充数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40073400/

相关文章:

java - 使用Arraylist的2D数组表示

java - 在java中对数组的输入设置一个范围

C++通过引用函数传递数组但内容保持不变

javascript - 在单独的函数中使用通过 AJAX 检索的 JSON 数据

javascript - 如何在 JavaScript 文件中引用导出的 TypeScript 类?

Java – 无法定位整数数组中的索引

c# - Array.BinarySearch<T>(T[], int, int, T) 引发的 ArgumentException

c++ - 如何在 C++ 中释放一个 int***

javascript - 如何使用jquery访问动态id标签

JavaScript XHR - "responseType"属性与 "Content-Type" header