如何在JavaScript中将对象属性字符串转换为整数

8
我想知道如何在 JavaScript 中将对象属性字符串转换为整数。 我有一个名为 obj 的对象,如果其中的属性值是数字字符串,则将其转换为数字。

var obj={
  ob1: {id: "21", width:"100",height:"100", name: "image1"},
  ob2: {id: "22", width:"300",height:"200", name: "image2"}
}


function convertIntObj (obj){
    Object.keys(obj).map(function(k) { 
            if(parseInt(obj[k])===NaN){
              return obj[k] 
            }
            else{
              return parseInt(obj[k]);
            }
        });
}

var result = convertIntObj(obj);

console.log(result)

期望的输出:

[  {id: 21, width:100,height:100, name: "image1"},  {id: 22, width:300,height:200, name: "image2"}]

1
你的 convertIntObj 函数中没有任何 return 语句,因此函数调用的返回值隐式为 undefined - VLAZ
2
... 而 NaN 不等于任何东西,甚至不等于自己。此外,您需要逐个映射 obj 的属性,目前您正在解析 obj 中的对象,而不是它们的属性。 - Teemu
4个回答

9
这应该可以完成工作:

var obj = {
  ob1: {
    id: "21",
    width: "100",
    height: "100",
    name: "image1"
  },
  ob2: {
    id: "22",
    width: "300",
    height: "200",
    name: "image2"
  }
}


function convertIntObj(obj) {
  const res = {}
  for (const key in obj) {
    res[key] = {};
    for (const prop in obj[key]) {
      const parsed = parseInt(obj[key][prop], 10);
      res[key][prop] = isNaN(parsed) ? obj[key][prop] : parsed;
    }
  }
  return res;
}

var result = convertIntObj(obj);

console.log('Object result', result)

var arrayResult = Object.values(result);

console.log('Array result', arrayResult)

点击“运行代码片段”以查看结果


谢谢你的帮助,但期望的输出是数组。 - miyavv
Object.values(result) 是你想要的数组。我已经在代码片段中添加了2行。 - Boris K
这个函数把 2021-1 转换成了 2021,这不是我们想要的结果。为了解决这个问题,我通过正则表达式添加了更严格的检查,以防止解析任何非数字字符,但我感觉我的代码有些笨重。您是否认为这符合您的预期呢?或者您能否看一下代码? - FreeSoftwareServers
要明确的是,我不希望2021-1被解析,而是由于非数字字符而保留为字符串。我使用它来解析JSON中的整数,以便在数组排序后使用,并且它适用于我想要的字段,但是我注意到其他不应转换的字段也受到了负面影响。 - FreeSoftwareServers

0

两次迭代Object.keys()。如果与键对应的值是数字,则将其解析为整数,否则设置先前存在的默认值

var obj = {
  ob1: { id: "21", width: "100", height: "100", name: "image1" },
  ob2: { id: "22", width: "300", height: "200", name: "image2" }
};

var res = {};

Object.keys(obj).forEach(key => {
  res[key] = {};
  Object.keys(obj[key]).forEach(temp => {
    res[key][temp] = !isNaN(obj[key][temp])
      ? parseInt(obj[key][temp], 10)
      : obj[key][temp];
  });
  return res;
});

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: 0; }


0
你可以使用 Object.entries().reduce() 方法来迭代数据中的键值对,并使用 NumberNumber.isNaN() 方法适当地转换值。

const data = {
  ob1: {id: "21", width:"100",height:"100", name: "image1"},
  ob2: {id: "22", width:"300",height:"200", name: "image2"}
};

const result = Object.entries(data).reduce((r, [k, o]) => {
    r[k] = Object.entries(o).reduce((r, [k, v]) => {
        let _v = Number(v);
        if(!Number.isNaN(_v)) { v = _v; }
        return (r[k] = v, r);
    }, {});
    return r;
}, {});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


-2

嗨,我建议您使用JSON.stringify()方法。它用于将对象转换为字符串,这是发送数据到Web服务器所需的。它将对象中的变量集合转换为JSON字符串:

var objToStr = {
  siteName: "W3Docs",
  bookName: "Javascript",
  booksCount: 5
};
var myJSON = JSON.stringify(objToStr);
console.log(myJSON);

此外,您可以使用 toString() 方法。当您需要将对象转换为字符串时,也会调用它:

var obj = {
  siteName: "W3Docs",
  bookName: "Javascript",
  booksCount: 5
};
function objToString(object) {
  var str = '';
  for (var k in object) {
    if (object.hasOwnProperty(k)) {
      str += k + '::' + object[k] + '\n';

这些信息来自于来源


这并没有回答提问者的问题。除非我搞错了,它恰恰相反地实现了提问者想要的(这很有意思,但并不特别有帮助)... - Luke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接