js数组数据转换格式


   var a = [
        { name: "张三", a: 12, b: 0, c: 12.333,d:12.556 },
        { name: "李四", a: "2", b: 2.3, c: 14.33,d:12.444 },
      ];

把上面数据,如果是数字,不管什么类型的,保留两位小数,不是数字原封不动,改成下面这种样子,可以控制四舍五入,

如果不想四舍五入,就转成这样:

   var c = [
        { name: "张三", a: 12.00, b: 0.00, c: 12.33,d:12.55 },
        { name: "李四", a: 2.00, b: 2.30, c: 14.33 ,d:12.44},
      ];

如果想四舍五入,就转成这样:

   var c = [
        { name: "张三", a: 12.00, b: 0.00, c: 12.33,d:12.56 },
        { name: "李四", a: 2.00, b: 2.30, c: 14.33 ,d:12.44},
      ];

这道题不错

希望对您有所帮助,望采纳

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
</body>
<script>
    var arr = [
        { name: "张三", a: 12, b: 0, c: 12.333,d:12.556 },
    { name: "李四", a: "2", b: 2.3, c: 14.33,d:12.444 },
    ];
    function test(arr, iftrunc) {
        var re = /^"?[0-9]+.?[0-9]*"?/;
        for (let i = 0; i < arr.length; i++) {
            var a = arr[i].a;
            if (re.test(a)) {
                //如果是由数字组成的字符串
                var an = Number(a)
                if (iftrunc) {
                    //如果四舍五入
                    console.log(an.toFixed(2))
                } else {
                    console.log((Math.floor(an*100)/100).toFixed(2))
                }
            }
            var b = arr[i].b;
            if (re.test(b)) {
                var an = Number(b)
                //如果是由数字组成的字符串
                if (iftrunc) {
                    //如果四舍五入
                    console.log(an.toFixed(2))
                } else {
                    console.log((Math.floor(an*100)/100).toFixed(2))
                }
            }
            var c = arr[i].c;
            if (re.test(c)) {
                var an = Number(c)
                //如果是由数字组成的字符串
                if (iftrunc) {
                    //如果四舍五入
                    console.log(an.toFixed(2))
                } else {
                    console.log((Math.floor(an*100)/100).toFixed(2))
                }
            }
            var d = arr[i].d;
            if (re.test(d)) {
                var an = Number(d)
                //如果是由数字组成的字符串
                if (iftrunc) {
                    //如果四舍五入
                    console.log(an.toFixed(2))
                } else {
                    console.log((Math.floor(an*100)/100).toFixed(2))
                }
            }
        }
    }
    test(arr, true);
    test(arr, false);
</script>
</html>


测试结果

img

看一下这个方法适合你的业务吗?



var a = [
  { name: "张三", a: 12, b: 0, c: 12.333, d: 12.556 },
  { name: "李四", a: "2", b: 2.3, c: 14.33, d: 12.444 },
];
var c = [
  { name: "张三", a: 12.00, b: 0.00, c: 12.33, d: 12.55 },
  { name: "李四", a: 2.00, b: 2.30, c: 14.33, d: 12.44 },
];

/**
 * @param { data } Array 需要格式化的数据
 * @param { format } Number 需要保留几位小数 
 */
const resetData = (data, format = 3) => {
  if (!Array.isArray(data)) throw new Error("Data type can only be an Array");
  return data.map(item => {
    for (let t in item) {
      console.log(item[t],t);
      if (typeof item[t] !== 'number' && t !== 'name') {
        item[t] = Number(item[t]).toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,')
      }
      if (typeof item[t] === 'number') {
        item[t] = item[t].toFixed(format).replace(/(\d)(?=(\d{3})+\.)/g, '$1,')
      }
    }
    return item
  })
}

const d = resetData(a)
console.log(d);

不能完全达到你的效果,如果你要保留2位小数就一定不能是数字了,因为12.00在js展示的是12,所以结果只能是字符串

var a = [
    {name: "张三", a: 12, b: 0, c: 12.333, d: 12.556},
    {name: "李四", a: "2", b: 2.3, c: 14.33, d: 12.444},
];

function changeData(a, type) {
    const numberFix = param => {
        let result
        if (type == "round") {
            result = Math.round(param * 100) / 100;
        } else {
            result = Number(param.toString().match(/^-?\d+(?:\.\d{0,2})?/)[0]);
        }
        return result.toFixed(2)
    }
    return a.map(item =>
        Object.keys(item).reduce((total, index) => {
            let itemElement = item[index];
            if (typeof (itemElement) == 'number') {
                itemElement = numberFix(itemElement)
            } else if (typeof (itemElement) == 'string' && /^-?\d+(?:\.\d*)?$/.test(itemElement)) {
                itemElement = numberFix(Number(itemElement))
            }
            total[index] = itemElement;
            return total
        }, {}))
}

console.log(changeData(a, 'noRound'))
console.log(changeData(a, 'round'))

img


 var a = [
        {name: "张三", a: 12, b: 0, c: 12.333, d: 12.556},
        {name: "李四", a: 2, b: 2.3, c: 14.33, d: 12.444},
      ];
      this.customSub(a, true);
      this.customSub(a, false);
 

customSub(a, roundFlag) {
        if (roundFlag) {
          var ae = [];
          for (const argument of a) {
            let b = {}
            for (const argumentKey in argument) {
              let r = argument[argumentKey];
              if (typeof (r) === 'number') {
                r = r.toFixed(2);
                r = Number(r);
                if ((r + '').indexOf('.') === -1) {
                  r = r + '.00';
                }
              }
              b[argumentKey] = r;
            }
            ae.push(b);
          }
          console.log('四舍五入结果=', JSON.stringify(ae))
        } else {
          var ae = [];
          for (const argument of a) {
            let b = {}
            for (const argumentKey in argument) {
              let r = argument[argumentKey];
              if (typeof (r) === 'number') {
                const rs = r + '';
                const index = rs.indexOf('.') + 3;
                const r1 = rs.substring(0, index);
                const r2 = Number(r1).toFixed(2);
                r = Number(r2);
                if ((r + '').indexOf('.') === -1) {
                  r = r + '.00';
                }
              }
              b[argumentKey] = r;
            }
            ae.push(b);
          }
          console.log('保留两位小数结果=', JSON.stringify(ae))
        }
      }