我的常规对象看起来像这样:
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
键中。
有什么想法吗?
答案 0 :(得分:3)
您的替换功能不正确。每当您想在JSON中包含键/值时,它都需要返回该值。您的代码使它仅返回undefined
,无论键/值如何。
所以使用这个:
function replacer(key, value) {
if (key !== "preset") { return value; }
}
或者,您也可以测试值的类型:
function replacer(key, value) {
if (!(value instanceof Preset)) { return value; }
}
答案 1 :(得分:0)
在对对象进行字符串化以得到结果之前,请删除objecrt副本上的键。您可以创建某种函数来从对象中删除键(如果存在)。
var obj = {
id: '1',
presetKey: 'abc',
preset: 'preset',
}
function filterPreset(obj, key) {
if (typeof obj === 'object' && 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);
答案 2 :(得分:0)
您可以使用... (spread operator)通过键解构该对象,并使用不包含preset
键的其余对象。
const data = {
id: '1234',
presetKey: 'xyz',
preset: 'customPreset'
};
const { preset, ...rest } = data;
console.log(rest);