将对象数组中的正数更改为负数

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 这样的元素类似于numbersamounts 中的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 的字符串数组

JS 遍历对象数组并将值更改为匹配的键并创建一个包含对象数组 [0] 中的键的新对象

使用 Php 将对象更改为数组 [重复]