转换嵌套对象中的所有值

时间:2020-04-30 10:22:54

标签: javascript

具有这样的数组:

fs= [ { "Val1" : "A", "Val2": 2.123, "Val3": 2.122 }, 
{ "Val1" : "B", "Val2": 3.123, "Val3": 2.112 }, 
{ "Val1" : "C", "Val2": 2.2134, "Val3": 2.122 }]

如何将所有浮点数更改为整数-从而忽略字符串值?

我当前的尝试是:

for (const [key, value] of Object.entries(fs)) {
  Object.keys(value).forEach(key => { Math.round(value[key])})
}

无论如何,它将字符串更改为NaN值,但我想保持它们不变并仅更改浮点数

4 个答案:

答案 0 :(得分:2)

首先使用typeof检查,并确保使用舍入结果:

const fs = [ { foo: "don't change me", "Val1" : "A", "Val2": 2.123, "Val3": 2.122 }, 
{ "Val1" : "B", "Val2": 3.123, "Val3": 2.112 }, 
{ "Val1" : "C", "Val2": 2.2134, "Val3": 2.122 }]

const newFs = fs.map(obj => (
  Object.fromEntries(
    Object.entries(obj).map(
      ([key, val]) => [key, typeof val === 'number' ? Math.round(val) : val]
    )
  )
));
console.log(newFs);

答案 1 :(得分:1)

您可以使用!isNaN(value)来简单地检查该值是否为数字,即使该值在字符串中,该值也将返回true

fs = [{
    Val1: "A",
    Val2: 2.123,
    Val3: 2.122
  },
  {
    Val1: "B",
    Val2: 3.123,
    Val3: 2.112
  },
  {
    Val1: "C",
    Val2: 2.2134,
    Val3: 2.122
  },
];

result = fs.map((f) =>
  Object.keys(f)
  .map((k) => ({
    [k]: !isNaN(f[k]) ? parseFloat(f[k]) : f[k]
  }))
  .reduce((a, b) => ({ ...a,
    ...b
  }), {})
);
console.log(result);

答案 2 :(得分:0)

我不知道,是这样的吗?:

fs.forEach(o => Object.entries(o).forEach(([k,v]) => {+v !== +v ? void(0) : o[k] = ~~v;}))

当心它会突变fs,切片将无济于事。如果不想浮点截断,请用round代替~~。

答案 3 :(得分:0)

您可以使用.reduce 每个对象中有多少个键,键名及其类型都可以使用此代码。

let fs = [ { "Val1" : "A", "Val2": 2.123, "Val3": 2.122, "Val4" : "wfA" }, 
{ "Val1" : "B", "Val2": 3.123, "Val3": 2.112, "Val4" : "3.42" }, 
{ "Val1" : "C", "Val2": 2.2134, "Val3": 2.122 }]

let one = fs.map(it => Object.keys(it).reduce((acc,rec) => {
  typeof it[rec] !== 'number' ? acc[rec] = it[rec] : acc[rec] = ~~it[rec]
  return acc}, {}))

console.log(JSON.stringify(one))