javascript - 如何正确遍历大型二维数组并将其数组传递到方法中的结果记录下来
问题描述
在学习了许多其他编码语言之后,我正在尝试使用 Javascript。
*编辑* 我解决了这个问题,我只需要在两个外部 for 循环中使用let关键字,它使用i作为迭代器变量的同名。
我有一个 29 行的 2D int 数组,每行包含一个长度为 744 的数组(744 * 29 = 21576 个数字),我想将每个数组或列传递给一个执行数学表达式的方法(即所有值的平均值、标准偏差等)并将结果记录到我的控制台。当我尝试这样做时,循环仅输出第一个数组中的数字的计算结果,而没有其他结果。我可能错了,但我觉得解决方案可能与等待结果和/或利用异步行为有关,或者我对如何将数组作为对象处理的误解。
首先,我已经在 fs.readFile 方法中编写了所有活动代码,该方法读取一个 JSON 文件,该文件为我提供所需的数据。
fs.readFile('./doc.json', 'utf-8', (err, text) => {...
结果数据是一个对象数组。以下是在数组中找到的信息层次结构。我使用三重 for 循环来访问所需的数据并填充我的二维数组。(我知道这几乎不是实现这一目标的最有效方法,但我认为它应该仍然有效)
//Array [
//Object {...
//Property: inner Array[
//inner Object {...
//Desired Property: object which contains the desired values{...}
// },...
// ]
// },...
// ]
for(let i = 0; i < dataArray.length; i++){
for(let j = 0; j < dataArray[i].property.length; j++){
let valueArray = Object.values(dataArray[i].property[j].desiredProperty).slice(0);
for(let c = 0; c < valueArray.length; c++;){
arr[c][(i * dataArray[i].property.length) + j] = valueArray[c];
}
}
}
填充它之后,我可以毫无问题地遍历 2D 数组并简单地将每个数字数组记录到控制台(以下循环在前一个循环之外)
for(i = 0; i < arr.length; i++){
console.log("array number " + (i + 1) + ": " + arr[i]);
}
但是,当我尝试将相同的数组传递给 GetTotal 方法(检索数组中所有数字的总和)并存储结果时,程序会输出第一个数字数组的平均值,然后立即结束。
for(i = 0; i < arr.length; i++){
console.log("array number " + (i + 1) + ": " + arr[i]);
let tot = GetTotal(arr[i]);
console.log("\nTotal: " + tot);
}
function GetTotal(nums){
let sum = 0;
for(i = 0; i < nums.length; i++){
sum += nums[i];
}
return sum;
}
不太清楚如何在此处发布图片,我相信这些将有助于更好地可视化情况
我使用 Create2DArray 方法初始化我的二维数组,然后用零填充每个新数组:
var arr= Create2DArray(numRows, numCols);
for(i = 0; i < arr.length; i++){
for(j = 0; j < arr[i].length; j++){
arr[i][j] = 0;
}
}
function Create2DArray(rows,cols){
let newArr = [];
for(i = 0; i < rows; i++){
newArr.push(new Array(cols));
}
return newArr;
}
我希望看到对所有数字数组执行方法计算的结果,而不仅仅是第一个。
谢谢你的时间。
解决方案
我不确定你到底在寻找什么。这将是我解决此类问题的方法:
var dataArray = [
{propertyArr : [{prop1 : 1, prop2 : 2}, {prop1 : 1, prop2 : 2}]},
{propertyArr : [{prop1 : 3, prop2 : 4}, {prop1 : 3, prop2 : 4}]},
{propertyArr : [{prop1 : 5, prop2 : 6}, {prop1 : 5, prop2 : 6}]}
]
var valueArray = [1,2,3,4,5,6,7] ;
var resultValues = dataArray.map((element,i) => {
var arr = element.propertyArr.map((object,j) => {
var value = valueArray[object.prop1] + valueArray[object.prop2] ;
return value ;
})
return arr ;
});
resultValues.forEach((elementArr,i) => {
elementArr.forEach((element2Arr,j)=>{
console.log(`resultValues[${i},${j}] : [${resultValues[i][j]}]`) ;
})
})
推荐阅读
- mysql - 这个mysql查询有更快的查询吗?
- c++ - C++ 仅更改 __int64 变量的低 32 位
- java - 如何弹出 Codenameone 表单以显示以前的表单
- android - 如何在 android studio 3.5 中添加不同密度的可绘制文件夹中的 jpg 文件?
- python - 为什么网络摄像头在 opencv 中显示任何内容
- matlab - MATLAB MPC 工具箱对未测量的输出设置约束
- javascript - Timer - Angular 8 的倒计时
- node.js - nuxt 找不到 runtime.js
- python - PyLint 显示 venv 中安装的包的导入错误
- opencv - 为什么 OpenCV VideoWriter 只支持 8 位深度的图像?