#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);