Почему я продолжаю получать сообщение об ошибке s не определено?

Я работаю над домашней задачей, и она продолжает возвращать ту же ошибку. Вот проблема. Напишите функцию с именем "json_average", которая принимает строку в формате JSON в качестве параметра в формате массива объектов, где каждый объект имеет ключи "масса", "плотность", "температура" и "скорость" и каждая клавиша сопоставляется с числом с плавающей запятой. Эта функция должна возвращать среднюю «скорость» всех объектов в массиве в виде строки JSON в формате {"velocity":}

Я пробовал переключать вещи, например, используя let s = 0 и var = 0, в любом случае это все еще не работает. Вот код, который я пробовал.

function json_average(x) {
    let data = JSON.parse(x);
    var s = 0 ;
    var n = 0; 
    var a;
    for (let i of data) {
        a = i["velocity"];
        s = s + a ;
        n = n + 1 ;
    }
    let d = {"velocity" : (s/n)};
    return(JSON.stringify(d));
}

Когда я отправляю код, это то, что он возвращает.

`error on input ['[{"mass": 3.55, "density": 380.72, "velocity": 33.11, "temperature": 46.8}, {"mass": 91.37, "density": 572.04, "velocity": 64.43, "temperature": -0.13}, {"mass": 40.4, "density": 124.52, "velocity": 52.8, "temperature": 38.81}, {"mass": 68.92, "density": 326.77, "velocity": 31.64, "temperature": 43.71}, {"mass": 3.22, "density": 419.85, "velocity": 70.64, "temperature": 23.58}]']:` 
ReferenceError: s is not defined

person Danny    schedule 05.11.2019    source источник
comment
let s = s + 1; вводит новую неинициализированную переменную s, к которой вы пытаетесь добавить 1. Почитайте, чем на самом деле занимаются var и let.   -  person Raymond Chen    schedule 05.11.2019
comment
Вы уже объявили переменные s и n перед циклом, используя var. Внутри блока цикла for вы снова объявили, используя let, который доступен только внутри блока цикла for. Вам нужно понимать области действия в Javascript.   -  person Masood    schedule 05.11.2019


Ответы (2)


Вы пытаетесь использовать s, когда он не инициализирован. Обновил функцию, надеюсь поможет.

function json_average(x) {
    let data = JSON.parse(x);
    var s = 0 ;
    var n = 0; 
    for (let i of data) {
        let a = i["velocity"];
        s = s + a ;
        n = n + 1 ;
    }
    let d = {"velocity" : (s/n)};
    return(JSON.stringify(d));
}

person SK -    schedule 05.11.2019

Вы переопределяете уже объявленную переменную внутри цикла, чтобы иметь область действия блока (в цикле). Переменные, объявленные с помощью let внутри блока, недоступны за пределами блока. Кроме того, если вы хотите задать s и эти другие переменные в блоке в цикле te, вы не сможете получить его значение вне цикла для вычисления скорости. См. скрипт js.

function json_average(x) {
    let data = JSON.parse(x);
    var s = 0 ;
    var n = 0; 
    for (i in data) {
        a = data[i]["velocity"];
        s = s + a ;
        n = n + 1 ;
    }

    let d = {"velocity" : (s/n)};
    return(JSON.stringify(d));
}

var result = json_average('[{"mass": 3.55, "density": 380.72, "velocity": 33.11, "temperature": 46.8}, {"mass": 91.37, "density": 572.04, "velocity": 64.43, "temperature": -0.13}, {"mass": 40.4, "density": 124.52, "velocity": 52.8, "temperature": 38.81}, {"mass": 68.92, "density": 326.77, "velocity": 31.64, "temperature": 43.71}, {"mass": 3.22, "density": 419.85, "velocity": 70.64, "temperature": 23.58}]');

console.log(result);

person Haider Ali    schedule 05.11.2019