Привет, мне нужно преобразовать числовые значения моего объекта в строку. Но разные свойства имеют разные правила преобразования.
Мой образец объекта:
{
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)
}
}
}
})
Но мои условия не срабатывают, и все свойства конвертируются одинаково.
Задача обратного вызова 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;
}
})
Надеюсь помочь тебе. Я добавляю, когда динамическое свойство
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);
Попробуйте использовать блок переключателей, который будет действительно хорош для этого. Подробное описание переключателя.
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);
}
}
})
if ((k !== "sRatio") || (k !== "name"))
всегда будет истинным. Просто используйтеif (k == "name") {} else if (k == "sRatio") {} else {}
||
должно быть&&
. См. Stackoverflow.com/questions/26337003/…