具有不同逻辑的JS对象的对象属性序列化

时间:2018-07-25 09:33:30

标签: javascript

嗨,我需要将对象的数值转换为字符串。但是不同的属性具有不同的转换规则。

我的样本对象:

{
name: "Name"
sRatio: 1.45040404
otherMetric: 0.009993
}

我使用JSON.stringify转换我的初始对象。

let replacemet = {}
JSON.stringify(metrics[0], function (key, value) {
  //Iterate over keys
  for (let k in value) {
    if ((k !== "sRatio") ||  (k !== "name"))  {
      replacemet[k] = (100*value[k]).toFixed(2) + "%"
    } else {
      if( k === "name") {
        replacemet[k] = "yo!"+value[k]
      } else{
        replacemet[k] = value[k].toFixed(2)
      }
    }
  }
})

但是没有触发我的条件,并且所有属性都以相同的方式转换。

3 个答案:

答案 0 :(得分:1)

replacer回调的工作不是填充某些全局replacemet对象,而是return一个新值。

我认为您正在寻找类似的东西

JSON.stringify(sample, function (key, value) {
  if (key == "sRatio") {
    return value.toFixed(2);
  } else if (key == "name") {
    return "yo!"+value;
  } else if (typeof value == "number") {
    return (100*value).toFixed(2) + "%"
  } else {
    return value;
  }
})

答案 1 :(得分:0)

请尝试使用对此非常有用的开关块。 Detailed description on switch.

let replacemet = {}
JSON.stringify(metrics[0], function (key, value) {
  //Iterate over keys
  for (let k in value) {       
    switch(k) {
    case "name":
        replacemet[k] = "yo!"+value[k];
        break;
    case "sRatio":
        replacemet[k] = value[k].toFixed(2);
        break;
    default:
        replacemet[k] = value[k].toFixed(2);
    }
  }
})

答案 2 :(得分:0)

希望对您有所帮助。我在动态属性时添加

         metrics =
            [
            {
            name: "Name",
            sRatio: 1.45040404,
            otherMetric:0.009993
            },
            {
            name: "Name1",
            sRatio: 2.45040404,
            otherMetric: 1.009993
            }
             ]
           ;
            let source = JSON.stringify(metrics);

            
           
            let arrJson  = new Array();
            //arrJson = {};
            metrics.forEach(function(value){
                let replacemet = {};
            
                for(var k in value) {
                
                 
                    if( k.toString().trim()  == "name") {
                        replacemet[k] =    "yo!"+value[k] ;
                   
                      } 
                     else 
                    if ( (  k.toString().trim() !== "sRatio") &&  ( k.toString().trim()  !== "name"))  {
                      replacemet[k] =  (100* value[k] ).toFixed(2).toString() + "%" ;
                    } else {
                     
                        replacemet[k] =    value[k].toFixed(2) ;
                      
                    }
                
                   
                }
                
               
               
               arrJson.push(JSON.stringify(replacemet)) ;
              
               
            });

           console.log(arrJson);