Функция восстановления JSON.parse: доступ к восстанавливаемому объекту?

#javascript #json

#javascript #json

Вопрос:

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

Если я передаю свою функцию восстановления, используя function(key,value {…} в отличие от использования функции со стрелкой (key, value) => {…} , ссылка this, похоже, относится к восстанавливаемому объекту. Это верно и для подобъектов в JSON. Я вижу это в node.js 8.x на сервере, а в Chrome current — на клиенте.

Понятно, что если я передаю функцию как функцию со стрелкой, вызывающий контекст сохраняется.

Я полагаюсь на это, чтобы добавлять и удалять некоторые ключи при разборе JSON.

Могу ли я полагаться на это поведение?

 var aTestStr = '{"prop1": "this is prop 1",'
     '"prop2": {"prop2A": 25, "prop2B": 13, "prop2C": "This is 2-c"}'
                 '}';
var aTestObj = JSON.parse(aTestStr, function(key, value) {
    //at this point, this refers to the object being revived
    //E.g., when key == 'prop1', this is an object with prop1 and prop2
    //when key == prop2B, this is an object with prop2A, prop2B and prop2C
    //So is this code reliable?
    if (key == this.prop2B) {
        //Do something, add a prop to this:
        this.prop2BDif = 100 - this.prop2B;
    }
});
 

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

1. Вам лучше изменить value key , когда "prop2"

Ответ №1:

Да, это задокументировано: документация JSON.parse в MDN

Если указан восстановитель, значение, вычисленное путем синтаксического анализа, преобразуется перед возвращением. В частности, вычисленное значение и все его свойства (начиная с наиболее вложенных свойств и заканчивая самим исходным значением) индивидуально запускаются через средство восстановления. Затем она вызывается, при этом объект, содержащий свойство, обрабатывается как this , и с именем свойства в виде строки и значением свойства в качестве аргументов.