【问题标题】:Best Practice when converting data in JavaScript在 JavaScript 中转换数据的最佳实践
【发布时间】:2018-07-14 10:08:58
【问题描述】:

我目前正在使用字符串形式的有效负载,我正在解析使用JSON.parse(payload)。我的问题是,一旦我转换了有效负载,我需要在新创建的 JSON 对象中访问至少 5 个属性,并且它是非常嵌套的。我目前的实现是:

 ....then(payload => {
   return ({
       obj1: JSON.parse(payload).field.obj1
       obj2: JSON.parse(payload).field.obj2
       obj3: JSON.parse(payload).field.obj3
       obj4: JSON.parse(payload).field.obj4
       obj5: JSON.parse(payload).field.obj5
     });    
   })

我觉得这是很多重复,并且觉得这种方式在可读性方面会更好(即使这样也不是那么干净):

   ....then(payload => {
       let jsonObj = JSON.parse(payload)
       return ({
           obj1: jsonObj.field.obj1
           obj2: jsonObj.field.obj2
           obj3: jsonObj.field.obj3
           obj4: jsonObj.field.obj4
           obj5: jsonObj.field.obj5
         });    
       })

谁能建议在可读性和性能方面执行此操作的最佳方法?

注意:这是在 promise.all() 中使用的,因此上面将迭代 X 个承诺。

【问题讨论】:

  • 首先,您应该只需要解析一次 JSON,然后您需要考虑填充模型客户端。从您希望拥有的内容开始,然后从服务器发回,或从响应映射到您希望拥有的内容。
  • 你的第二种方法没关系,你不需要做任何进一步的事情。
  • jsonObj.field 是否包含任何其他属性?
  • 是的。 @Bergi
  • 我猜这会变成One-liner to take some properties from object in ES6的副本。 (你应该只打电话给JSON.parse 一次希望是显而易见的)

标签: javascript json promise es6-promise


【解决方案1】:

如果你使用Bluebird,你也可以这样做(因为你已经使用Promise.all

const payloadPromises = Promise.map(sourcePromises, JSON.parse);
return Promise
  .all(payloadPromises)
  .then(payloads => payload.map(payload => ({
    obj1: payload.field.obj1,
    obj2: payload.field.obj2,
  }));

但实际上只是变量(您的第二种方法)完全没问题。也许,在这种情况下,您应该只使用const 而不是let

【讨论】:

    【解决方案2】:

    编辑

    更好的是,只需解析整个内容并返回字段对象。我认为那会奏效。 (不过我有点睡眠不足!)

    ....then(payload => {
       return (JSON.parse(payload).field);
    })
    

    结束编辑

    1. 解析整个响应以找到field obj。
    2. field obj 进行字符串化以准备将其复制。
    3. 返回解析后的fieldobj。

    -

    ....then(payload => {
       return (JSON.parse(JSON.stringify(JSON.parse(payload).field)));
    })
    

    【讨论】:

      【解决方案3】:

      您可以使用 destructuring assignment 并返回带有 short hand properties 的对象。

      let { field: { obj1, obj2, obj3, obj4, obj5 } } = JSON.parse(payload);
      return { obj1, obj2, obj3, obj4, obj5 };
      

      【讨论】:

      • 这是很多重复,不是吗?
      • 视情况而定,实际上看起来是这样的,但我们不知道原始结构。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多