Javascript 如何将对象中的所有属性值转换为字符串类型?

Javascript 如何将对象中的所有属性值转换为字符串类型?,javascript,object,Javascript,Object,我正在处理一个包含属性的对象,这些属性的值可以是string类型,也可以是number类型。某些特性是嵌套对象,这些嵌套对象还包含值可以是类型字符串或类型编号的特性。以以下对象为简化示例: var myObj = { myProp1: 'bed', myProp2: 10, myProp3: { myNestedProp1: 'desk', myNestedProp2: 20 } }; 我希望所有这些值都是string类型,因此任何number类型的值都需要转换

我正在处理一个包含属性的对象,这些属性的值可以是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))您可以使用lodash
cloneDeepWith
功能

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));