将对象数组中的正数更改为负数
Posted
技术标签:
【中文标题】将对象数组中的正数更改为负数【英文标题】:Change the positive number to negative number in array of object 【发布时间】:2021-08-20 10:16:43 【问题描述】:给定数据库中的array
中的object
:
detail : [
0:
Code: "Code 1",
Price: "1.00",
IncTaxPrice: "1.20",
Tax:"0.20",
,
1:
Code: "Code 2",
Price: "9.00",
IncTaxPrice: "9.20",
Tax:"0.20",
]
我想要的输出,键和值为负(例如)
[
Code: "Code 1",
Price: "-1.00",
IncTaxPrice: "-1.20",
Tax: "-0.20",
,
Code: "Code 2",
Price: "-9.00",
IncTaxPrice: "-9.20",
Tax: "-0.20",
,
];
我尝试使用map
,过滤器function
,但它给出了一个错误,我想我错过了一些东西。
正确过滤后,我将使用-Math.abs()
,将positive
转换为negative
。
let final = detail.map(a => Object.values(a).filter(v => typeof v === 'number'))
像price
,tax
这样的元素类似于numbers
和amounts
中的8 个不同的elements
。
【问题讨论】:
"出现错误" 什么错误?请注意detail
的语法无效。
您的数组对象中没有数值。只有字符串值。
如果是财务,请小心使用Math.abs()
,只需使用var newvalue = -oldvalue
翻转标志即可。这是因为理论上价格可能是负数,也就是退款。
@Andreas 另外typof
将为每个返回"string"
,因为它们都不是数字。
filter(v => !isNaN(Number(v))
你应该改变你的过滤器,因为所有的数字都是一个字符串。
【参考方案1】:
感谢@VLAZ 在评论中的建议。我认为您可以使用 Object.keys() 按键进行过滤。
以下示例:
const detail = [
Code: "Code 1",
Price: "1.00",
IncTaxPrice: "1.20",
Tax: "0.20",
,
Code: "Code 2",
Price: "9.00",
IncTaxPrice: "9.20",
Tax: "-0.20",
,
];
let final = detail.map(x => (
Code: x.Code,
Price: -Number(x.Price),
IncTaxPrice: -Number(x.IncTaxPrice),
Tax: -Number(x.Tax),
));
console.log(final);
【讨论】:
-a[key])
足以翻转标志。一元 -
将转换为数字并翻转符号。如果你想明确一点,那么-Number(a[key])
更好,因为a[key]
已经是负数了。例如,如果是"-5"
,那么"-" + "-5"
将是"--5"
,它转换为NaN
@VLAZ,哇.. 再次感谢您的提醒!我更新了我的答案,因为 OP 想要一个负值,我使用 Math.abs()
@ikhvjs ,实际上我需要像[ Code: "Code 1", Price: -1.00, IncTaxPrice: -1.20, Tax: -0.20, , Code: "Code 2", Price: -9.00, IncTaxPrice: -9.20, Tax: -0.20, , ];
这样的键和值输出
对于金融交易,避免abs
,确实是个好主意。像@VLAZ 指出的那样做-Number(a[key])
会更安全,并且会将它们翻转为负数,除非价格为负数,在这种情况下它会使它们变为正数,保持这些负数很可能会导致问题。 . 而您使用9.00, 9.20, -0.20
的示例数据完全没有意义。
@Harshu,我更新了答案,但我无法检索一些带 2 位小数的数字。如果你想返回一个整数或带 1 个小数的数字,它会是一个字符串。【参考方案2】:
您应该将 0、1 索引括在大括号中,因为它是一个对象数组。您不能像以前那样定义它,因为索引 0 和 1 不仅仅是数字(fex。[0,1,2]
是有效的,但不是 [0:code:...,1:code:...]
它们在内部连接一个对象,所以它们是对象,如果您的对象数组未正确定义为:
[0:code:..,1:code:..。
同样使用 typeof 过滤器也不起作用,因为所有值都是字符串类型。
我会这样:
let detail = [
0:
Code: "Code 1",
Price: "1.00",
IncTaxPrice: "1.20",
Tax:"0.20",
,
1:
Code: "Code 2",
Price: "9.00",
IncTaxPrice: "9.20",
Tax:"0.20",
]
detail.map(el=>
el[Object.keys(el)[0]]['Price']=(-parseFloat(el[Object.keys(el)[0]]['Price'])).toString()
el[Object.keys(el)[0]]['IncTaxPrice']=(-parseFloat(el[Object.keys(el)[0]]['IncTaxPrice'])).toString()
el[Object.keys(el)[0]]['Tax']=(-parseFloat(el[Object.keys(el)[0]]['Tax'])).toString()
return
)
【讨论】:
我相信 OP 问题中的[0:
位正是一些调试器显示数组的方式。以上是关于将对象数组中的正数更改为负数的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB如何将数组中的字段类型从字符串更改为数组并保持原始值
MongoDB,将对象数组更改为包含其 ObjectId 的字符串数组