#javascript #reviver-function
#javascript #средство восстановления-функция
Вопрос:
Я пытаюсь проанализировать список объектов JSON в переменную с именем jsonStructure с помощью функции восстановления, которая добавляет 5 к объекту ‘year’ в переменной StringData. Однако переменная возвращает значение undefined. Я не уверен, что я делаю не так, поскольку у меня анализатор настроен точно так, как указано в книге. Вот мой код ниже:
var stringData = '{ "year": 2011, "month": 8, "day": 9, "hour": 5, "minute": 32 }';
var jsonStructure = JSON.parse(stringData, function (key, value) {
if (key == "year")
return value 5;
});
Ответ №1:
Проблема
Проблема здесь в том, что вы не возвращаете никакого значения, если ключ не совпадает year
, что фактически делает все остальное неопределенным
Решение
Нам всегда нужно быть уверенными, что мы возвращаем значение из нашего средства восстановления:
var stringData = '{ "year": 2011, "month": 8, "day": 9, "hour": 5, "minute": 32 }';
var jsonStructure = JSON.parse(stringData, function (key, value) {
return key == "year" ? value 5 : value;
});
console.log(jsonStructure)
Объяснение
С сайта документации MDN:
Использование параметра reviver
Если указан средство восстановления, значение, вычисленное путем синтаксического анализа, преобразуется перед возвращением. В частности, вычисленное значение и все его свойства (начиная с наиболее вложенных свойств и заканчивая самим исходным значением) индивидуально прогоняются через средство восстановления. Затем вызывается объект, содержащий свойство, обрабатываемое как this, с именем свойства в виде строки и значением свойства в качестве аргументов. Если функция восстановления возвращает значение undefined (или не возвращает значения, например, если выполнение прерывается в конце функции), свойство удаляется из объекта. В противном случае свойство переопределяется как возвращаемое значение.
Ответ №2:
var stringData = '{ "year": 2011, "month": 8, "day": 9, "hour": 5, "minute": 32 }';
var jsonStructure = JSON.parse(stringData, function(key, value) {
if (key == "year") {
return value 5;
}
return value
});
console.log(jsonStructure);