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