具有这样的数组:
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值,但我想保持它们不变并仅更改浮点数
答案 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))