代码之家  ›  专栏  ›  技术社区  ›  Alexander Mills

根据上下文对对象进行不同的字符串化

  •  0
  • Alexander Mills  · 技术社区  · 6 年前

    我有一个带有toJSON方法的对象:

    const v = {
      foo: 'zoom1',
      bar: 'zoom2',
      toJSON(){
         return {foo: this.foo}
      }
    }
    

    当我打电话的时候 JSON.stringify(v) 我会得到的 {foo:'zoom1'} -我的问题是-有没有一种方法可以根据调用JSON.stringify()的人对其进行不同的字符串化,例如,如果我想:

    {bar: 'zoom2'}
    

    相反呢?也许有一个很好的设计模式,不知道。

    4 回复  |  直到 6 年前
        1
  •  3
  •   Sergio Flores    6 年前

    实际上,你可以用替代品 parameter stringify

    改变字符串化过程行为的函数,或字符串和数字对象的数组,用作选择/筛选要包含在JSON字符串中的值对象属性的白名单。如果此值为null或未提供,则对象的所有属性都包含在生成的JSON字符串中。

    const v = {
      foo: 'zoom1',
      bar: 'zoom2'
    };
    
    JSON.stringify(v, ['foo']);
    // Outputs "{"foo":"zoom1"}
    
    JSON.stringify(v, ['bar']);
    // Outputs "{"bar":"zoom2"}
    
    JSON.stringify(v, ['foo', 'bar']);
    // Outputs "{"foo":"zoom1", "bar":"zoom2"}
    
        2
  •  2
  •   Michael Jasper    6 年前

    有两种不推荐使用的方法可用于确定谁调用了特定函数: arguments.callee function.caller .

    flat deep 要返回对象的两个不同视图:

    const myData = {}
    
    const flatSerializer = (data) => {}
    const deepSerializer = (data) => {}
    
    const flatString = flatSerializer(myData)
    const deepString = deepSerializer(myData)
    

    使用同一个示例,您可能会遇到以下情况:

    const myData = {}
    
    const serializer = fn => data => fn(data)
    const flat = data => {}
    const deep = data => {}
    
    const flatSerialize = serializer(flat)
    const deepSerialize = serializer(deep)
    
    const flatString = flatSerialize(myData)
    const deepString = deepSerialize(myData)
    
        3
  •  2
  •   Vasan    6 年前

    一种选择是使用 replacer 论据 stringify . 它是一个调用的函数,每个属性的键和值在对象中被字符串化,如果返回 undefined 从中,属性被排除在stringify结果之外。

    你可以在一个库中有一堆replacer函数,每一个函数都会为你想要排除的一组属性返回未定义的值,也就是说,本质上创建不同的对象“视图”。然后调用方在调用stringify时选择所需的替换项。

    Reference

        4
  •  0
  •   Alexander Mills    6 年前

    我还没试过,但我想定制的替代品就是答案,类似这样:

    const result = JSON.stringify(v, (val) => {
    
       if(val instanceof whatever){
          return {bar: val.bar};
       }
    
       return val;
    
    });