JSON Stringify忽略Nesten对象中的键?

时间:2019-03-23 14:46:30

标签: 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键中。

有什么想法吗?

3 个答案:

答案 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);