【问题标题】:How to convert string values into numbers and booleans from an object?如何将字符串值从对象转换为数字和布尔值?
【发布时间】:2021-08-29 18:33:50
【问题描述】:

例如,如果我有类似的 JavaScript 对象,

{
    id: "234",
    name: "shreyas",
    active: "true"
}

我怎样才能把它变成这样

{
    id: 234,
    name: "shreyas",
    active: true
}

基本上从数字和布尔值中删除""(双引号)。

我设法删除了布尔值

let query = JSON.stringify(req.query);
query.replace(/"true"/g, `true`).replace(/"false"/g, `false`);
query = JSON.parse(query)

除了数字之外,我怎样才能做到这一点?

到目前为止我尝试了什么:

const nums = query.match(/"\d+"/g);
        
nums?.forEach((num) => {
            
    const newNum = parseInt(num)

    query.replace(`${num}`, `'${newNum}'`);
});

【问题讨论】:

  • 我认为parseInt() 应该可以解决您的问题
  • IKR,但我如何找到带双引号的数字,并用相同的值替换没有 qoutes 的数字? const nums = query.match(/"\d+"/g); nums?.forEach((num) => { const newNum = parseInt(num) query.replace(`${num}`, `'${newNum}'`); });
  • 我们为什么不找到问题的根源呢?这些物体是从哪里来的?哪些代码负责将这些数字和布尔属性添加为字符串?
  • 这来自我的 API 的查询参数。不过,这是一个很好的观点。

标签: javascript json object serialization


【解决方案1】:

我的代码并不完美,但我希望它可以提供一点帮助

let blah = {
    id: "234",
    age: "44",
    name: "shreyas",
    active: "true",
    isActive: "false"
};

console.log(converting(blah));

function converting(obj) {
  let keys = Object.keys(obj);

  for (let key of keys) {
    // convert to int
    if (parseInt(obj[key])) {
      obj[key] = parseInt(obj[key]);
    }
    // convert to boolean
    if (String(obj[key]).toLocaleLowerCase() === 'true' ||
    String(obj[key]).toLocaleLowerCase() === 'false') {
      obj[key] = String(obj[key]).toLocaleLowerCase() === 'true';
    }
  }

  return obj;
}

【讨论】:

    【解决方案2】:

    我的process.env 遇到了同样的问题。所以我创建了parser 函数用于类型清除解析输出

    1. 我们需要预先声明数组中的真假值
    2. 然后根据匹配的数组条件返回循环内的值
    3. isNaN(Number(str)) 它只接受纯数字。允许这样"292" 而不是a233
    4. 另外,您可以从字符串 one,two,three => ["one","two","three"] 创建数组

    const obj = { id: "234", name: "shreyas", active: "true",arr:"one,two,three" }
    
    
     const clean = (value = '') => {
        let FALSY_VALUES = ['', 'null', 'false', 'undefined'];
        let TRUE_VALUES = ["true"];
        if (!value || FALSY_VALUES.includes(value)) {
            return false;
        }else if (!value || TRUE_VALUES.includes(value)) {
            return true;
        } else if (!isNaN(Number(value))) {
            return Number(value);
        } else if (value.match(',')) {
            return value.split(',').map((a) => a.trim());
        }
        return value;
    };
    
     const parser = (a)=> {
        let env = {};
        for (const k in a) {
            env[k] = clean(a[k]);
        }
        return env;
    };
    
    
    console.log(parser(obj))

    【讨论】:

    • 感谢 prasanth!这很棒!正是我想要的。我希望将来 JavaScript 有这个内置功能。 :)
    【解决方案3】:
    1. 将字符串转换为 int:parseInt() - 这会将带有 "" 的数字转换为它的值。

    2. 将字符串转换为布尔值:使用Boolean(value)!!value

    【讨论】:

    • 嘿丹尼尔,我怎样才能通过搜索和替换字符串中的值来做到这一点?也可以有多个。对于数字,与布尔值不同,不仅有 2 个值。那么你知道如何替换任何双引号号码吗?
    • 嗨,我不太明白你的意思,但要在"" 内转一个数字,请使用函数parseInt(str),它接受像"123" 这样的字符串并返回123。如果您询问字符串何时为 "43a",我会事先使用 RegEx 进行检查。
    猜你喜欢
    • 1970-01-01
    • 2011-02-17
    • 2012-04-02
    • 2021-02-23
    • 2018-09-07
    • 1970-01-01
    • 2019-03-07
    • 2013-01-24
    相关资源
    最近更新 更多