Javascript 如何将对象中的所有属性值转换为字符串类型?
我正在处理一个包含属性的对象,这些属性的值可以是string类型,也可以是number类型。某些特性是嵌套对象,这些嵌套对象还包含值可以是类型字符串或类型编号的特性。以以下对象为简化示例:Javascript 如何将对象中的所有属性值转换为字符串类型?,javascript,object,Javascript,Object,我正在处理一个包含属性的对象,这些属性的值可以是string类型,也可以是number类型。某些特性是嵌套对象,这些嵌套对象还包含值可以是类型字符串或类型编号的特性。以以下对象为简化示例: var myObj = { myProp1: 'bed', myProp2: 10, myProp3: { myNestedProp1: 'desk', myNestedProp2: 20 } }; 我希望所有这些值都是string类型,因此任何number类型的值都需要转换
var myObj = {
myProp1: 'bed',
myProp2: 10,
myProp3: {
myNestedProp1: 'desk',
myNestedProp2: 20
}
};
我希望所有这些值都是string类型,因此任何number类型的值都需要转换
实现这一目标的最有效方法是什么
我尝试了使用中的,也尝试了使用Object.keys,但没有成功。任何见解都将不胜感激。使用toString()方法
您可以使用
递归
方法来查看所有键
Object.keys()
方法返回给定对象自身的可枚举属性的数组
有两种情况:
- 如果
运算符返回typeof
,则必须调用该函数object
- 否则,您只需要应用
方法String()
三元
运算符进行单行
求解
typeof myObj[key] == 'object' ? replace(myObj[key]) : myObj[key]= myObj[key].toString();
var myObj={
myProp1:'床',
myProp2:10,
myProp3:{
myNestedProp1:“办公桌”,
myNestedProp2:20
}
};
功能替换(myObj){
Object.key(myObj).forEach(函数(key){
myObj[key]=“object”?替换(myObj[key]):myObj[key]=字符串(myObj[key]);
});
}
替换(myObj);
console.log(myObj)代码>Object.keys应该可以,在查找嵌套对象时只需使用递归即可。若要将某个内容转换为字符串,只需使用此技巧即可
var str = '' + val;
var myObj={
myProp1:'床',
myProp2:10,
myProp3:{
myNestedProp1:“办公桌”,
myNestedProp2:20
}
};
函数到字符串(o){
Object.keys(o.forEach)(k=>{
if(o[k]=“对象”的类型){
返回字符串(o[k]);
}
o[k]=''+o[k];
});
返回o;
}
console.log(toString(myObj))代码>您可以使用lodashcloneDeepWith
功能
import * as _ from 'lodash';
var myObj = {
myProp1: 'bed',
myProp2: 10,
myProp3: {
myNestedProp1: 'desk',
myNestedProp2: 20
}
};
function toString(obj) {
return _.cloneDeepWith(obj, val => val.toString());
}
console.log(toString(myObj));
更新:显然,该功能在npm中仅适用于NodeJ。不完全符合要求,但它可能很有用。实施
const person={
姓名:'约翰',
年龄:25岁,
地址:{
街道:“绿色”,
门牌号:11
},
核实:对,,
bio:null,
createdAt:NaN
};
函数转换器ValuesToStringsDeep(obj){
return\uu0.cloneDeepWith(对象,值=>{
return!\ u0.isPlainObject(值)?\ u0.toString(值):未定义;
});
}
const copy=convertValuesToStringsDeep(个人);
控制台日志(副本)代码>
请发布您尝试过的内容。@asw1984,它对您有效?(1)这不是有效的语法(它需要有两个句点)和(2)我想OP是在问如何使用已创建的myObj
——否则,为什么不将数字放在引号中,而不是执行.toString()
?我明白了,那么我们是否应该使用myObj.toString()
?OP似乎想要迭代对象的所有属性和子属性(等等),并将它们转换为字符串。它似乎在玩downvote
按钮+不管怎样:)正是我想要的。如果数据不是一个对象,而是一个对象数组,每个对象都需要与上面的对象相同的处理,那么这种情况又如何呢?从性能的角度来看,将forEach封装在另一个forEach中似乎效率低下。也许有更好的方法来解释对象数组?谢谢,解决了我的问题,它转换整个对象或可以有数组的嵌套对象,还添加了一个属性来检查属性是否为空,然后失败,因此添加,!isNullOrUndefined(object[k])
关于可变性呢?此方法似乎改变了原始对象,在某些情况下可能会导致问题。如何在不改变原始版本的情况下实现它?我试图使用lodash cloneDeep创建原始对象的深度副本,但不幸的是,嵌套的对象键未转换。您可以先克隆输入对象,然后将克隆传递给toString
方法。旁注:如果只有字符串和数字,则调用toString()
在这种情况下可以正常工作,但如果值也可以是null
或未定义的
,则它将失败。在这些情况下,String(value)
或''+value
会起作用。@FelixKling,是的,这是真的。更新。这似乎不起作用-注意链接到一个正在工作的JSFIDLE吗?
import * as _ from 'lodash';
var myObj = {
myProp1: 'bed',
myProp2: 10,
myProp3: {
myNestedProp1: 'desk',
myNestedProp2: 20
}
};
function toString(obj) {
return _.cloneDeepWith(obj, val => val.toString());
}
console.log(toString(myObj));