Как правильно выполнить итерацию по большому 2D массиву и записать результаты передачи его массивов в метод

#javascript #arrays #debugging #iteration

#javascript #массивы #отладка #итерация

Вопрос:

Я пробую свои силы в Javascript после изучения ряда других языков программирования.

* Редактировать* Я исправил проблему, мне просто пришлось использовать ключевое слово let в обоих внешних циклах for, которые использовали i как одно и то же имя для переменной итератора.

У меня есть массив 2D int с 29 строками, каждая из которых содержит массив длиной 744 (744 * 29 = 21576 чисел), и я хотел бы передать каждый массив или столбец в метод, который выполняет математические выражения (т. Е. среднее значение всех значений, стандартное отклонение и т.д.) И регистрирует результаты на моей консоли. Когда я пытаюсь это сделать, цикл выводит только результаты вычисления чисел в 1-м массиве и ни одного из остальных. Возможно, я ошибаюсь, но у меня есть ощущение, что решение может быть как-то связано с ожиданием результата и / или использованием асинхронного поведения, или с моим непониманием того, как обращаться с массивом как с объектом.

Прежде всего, я написал весь свой активный код в методе fs.ReadFile, который считывает файл JSON, который предоставляет мне нужные данные.

 fs.readFile('./doc.json', 'utf-8', (err, text) => {...
  

Результирующие данные представляют собой массив объектов. Ниже приведена иерархия информации, найденной в массиве. Я использую тройной цикл for для доступа к нужным данным и заполнения моего 2D-массива. (Я знаю, что это далеко не самый эффективный способ достижения этой цели, но я полагаю, что он должен работать, тем не менее)

 //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;
}
  

Не совсем уверен, как размещать здесь фотографии, я уверен, что они были бы полезны для лучшей визуализации ситуации

Я инициализирую свой 2D-массив с помощью метода 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;
}
  

Я хотел бы видеть результат выполнения вычислений метода для ВСЕХ массивов чисел, а не только для первого.

Спасибо за ваше время.

Комментарии:

1. Я не смог воссоздать вашу проблему после заполнения массивов случайными значениями. Возможно, более полный пример кода, показывающий отношения частей в рамках процесса, может дать подсказку? Смотрите этот JSFiddle ;

2. Спасибо за комментарий, я добавил больше информации о доступе / заполнении данных. Весь остальной код просто хранит и отлаживает различные значения, такие как нахождение стандартного отклонения, нахождение стандартных значений, наибольшее среднее значение, наибольшее общее и т. Д

Ответ №1:

Я не уверен, что понял, что именно вы ищете. Это был бы мой подход к такого рода проблемам :

 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]}]`) ;                  
  })                       
})