我正在处理包含属性的对象,这些属性的值为字符串类型或类型编号。某些属性是嵌套对象,这些嵌套对象还包含值可以是字符串类型或类型编号的属性。以下面的对象为简单示例:
var myObj = {
myProp1: 'bed',
myProp2: 10,
myProp3: {
myNestedProp1: 'desk',
myNestedProp2: 20
}
};
我希望所有这些值都是字符串类型,因此需要转换任何类型为number的值。
实现这一目标的最有效方法是什么?
我尝试过使用for..in并且还使用了Object.keys,但是没有成功。任何见解将不胜感激。
答案 0 :(得分:5)
Object.keys应该没问题,你只需要在找到嵌套对象时使用递归。要将某些内容转换为字符串,您只需使用此技巧
即可var str = '' + val;
var myObj = {
myProp1: 'bed',
myProp2: 10,
myProp3: {
myNestedProp1: 'desk',
myNestedProp2: 20
}
};
function toString(o) {
Object.keys(o).forEach(k => {
if (typeof o[k] === 'object') {
return toString(o[k]);
}
o[k] = '' + o[k];
});
return o;
}
console.log(toString(myObj));
答案 1 :(得分:2)
您可以使用recursive
方法查看所有keys
。
Object.keys()
方法返回给定对象自己的可枚举属性的数组。
有两种情况:
如果typeof
运营商返回object
,则您必须召回该功能。
否则,您只需要应用String()
方法。
但您可以将ternary
运算符用于one-line
解决方案。
typeof myObj[key] == 'object' ? replace(myObj[key]) : myObj[key]= myObj[key].toString();
var myObj = {
myProp1: 'bed',
myProp2: 10,
myProp3: {
myNestedProp1: 'desk',
myNestedProp2: 20
}
};
function replace(myObj){
Object.keys(myObj).forEach(function(key){
typeof myObj[key] == 'object' ? replace(myObj[key]) : myObj[key]= String(myObj[key]);
});
}
replace(myObj);
console.log(myObj);
答案 2 :(得分:1)
您可以使用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));
答案 3 :(得分:0)
询问的内容不完全相同,但可能很有用。使用lodash
实施
const person = {
name: 'John',
age: 25,
address: {
street: 'Green',
houseNumber: 11
},
verified: true,
bio: null,
createdAt: NaN
};
function convertValuesToStringsDeep(obj) {
return _.cloneDeepWith(obj, value => {
return !_.isPlainObject(value) ? _.toString(value) : undefined;
});
}
const copy = convertValuesToStringsDeep(person);
console.log(copy);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>
对象副本将为:
{
"name": "John",
"age": "25",
"address": {
"street": "Green",
"houseNumber": "11"
},
"verified": "true",
"bio": "",
"createdAt": "NaN"
}
答案 4 :(得分:-1)
使用toString()方法; mozilla reference here
var myObj = {
myProp1: 'bed',
myProp2: (10).toString(),
myProp3: {
myNestedProp1: 'desk',
myNestedProp2: (20).toString()
}
};