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

时间:2017-10-27 20:10:26

标签: javascript object

我正在处理包含属性的对象,这些属性的值为字符串类型或类型编号。某些属性是嵌套对象,这些嵌套对象还包含值可以是字符串类型或类型编号的属性。以下面的对象为简单示例:

var myObj = {
  myProp1: 'bed',
  myProp2: 10,
  myProp3: {
    myNestedProp1: 'desk',
    myNestedProp2: 20
  }
};

我希望所有这些值都是字符串类型,因此需要转换任何类型为number的值。

实现这一目标的最有效方法是什么?

我尝试过使用for..in并且还使用了Object.keys,但是没有成功。任何见解将不胜感激。

5 个答案:

答案 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()
  }
};