JSON Stringify игнорирует ключ в объекте nesten?

#javascript #json

#javascript #json

Вопрос:

Мой обычный объект выглядит следующим образом:

 export class Routine {
    id: string;
    name: string;
    exercises: RoutineExercise[];
}
  

Мой объект RoutineExercise выглядит следующим образом:

 export class RoutineExercise {

    id: string;
    presetKey: string;
    preset: Preset;
}
  

Мне нужно преобразовать обычный объект в объект JSON, но мне нужно исключить preset объект из каждого RoutineExercise

Итак, мне нужно сделать что-то вроде этого:

 function replacer(key, value) {
    if (key === "preset") {return undefined; }
}

const jsonString = JSON.stringify(routine, replacer);
console.log(JSON.parse(jsonString));
  

Но это не исключает мои предварительные настройки. Вероятно, потому, что preset ключ вложен в exercise ключ.

Есть идеи, как это сделать?

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

1. Ваша replacer функция должна возвращать значение, когда вам нужно его сохранить , поэтому используйте это: if (key !== "preset") return value; Есть и другой случай undefined , но это значение по умолчанию.

Ответ №1:

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

Так что используйте этот:

 function replacer(key, value) {
    if (key !== "preset") { return value; }
}
  

Или, в качестве альтернативы, вы могли бы проверить тип значения:

 function replacer(key, value) {
    if (!(value instanceof Preset)) { return value; }
}
  

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

1. Спасибо, это было то, что я искал!

Ответ №2:

Удалите ключ в копии objectcrt перед тем, как преобразовать объект в строку, чтобы получить свой результат. Вы можете создать какую-то функцию, которая удаляет ключ из объекта, если он существует.

 var obj = {
    id: '1',
    presetKey: 'abc',
    preset: 'preset',
}

function filterPreset(obj, key) {
  if (typeof obj === 'object' amp;amp; obj[key]) {
    var copy = Object.assign({}, obj);
    delete copy[key];
    return copy;
  }
  return obj;
}

console.log('result', JSON.stringify(filterPreset(obj, 'preset')));
console.log('no mutation', obj);  

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

1. Нет, он создает копию.

2. Должен быть рекурсивным, чтобы иметь дело с вложенными объектами.

Ответ №3:

Вы можете использовать … (оператор распространения) для деконструкции объекта по ключу и использования объекта rest, который не содержит preset ключа.

 const data = {
    id: '1234',
    presetKey: 'xyz',
    preset: 'customPreset'
};

const { preset, ...rest } = data;

console.log(rest);