在JavaScript中转换数据时的最佳实践

时间:2018-02-04 11:27:09

标签: javascript json promise es6-promise

我目前正在处理一个字符串的有效负载,即时解析正在使用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承诺。

3 个答案:

答案 0 :(得分:0)

您可以使用destructuring assignment并使用short hand properties返回一个对象。

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

答案 1 :(得分:0)

修改

更好的是,只需解析整个事物并返回字段对象。我认为那会有用。 (虽然我有点睡不着觉!)

bindService()

结束修改

  1. 解析整个回复以找到....then(payload => { return (JSON.parse(payload).field); }) obj。
  2. field obj进行字符串化以准备将其复制。
  3. 返回已解析的field obj。
  4. -

    field

答案 2 :(得分:0)

如果你使用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