【问题标题】:javascript: round numeric values of N-dimensional arrayjavascript:N维数组的四舍五入数值
【发布时间】:2017-05-13 10:39:31
【问题描述】:

我需要以给定的精度对数组中的值进行舍入。数组可以包含任何数据类型,因此非数字值应保持“原样”。需要两位小数的数组的示例:

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

function roundNumericValuesInArray(array, precision){
    var roundedArray = [];

    array.forEach(function round(elem){
        if(isNumber(elem)) {
            roundedArray.push(elem.toFixed(precision));
        } else{
            roundedArray.push(elem);
        }
    })

    return roundedArray;
}
var simpleArray = [5.454545, 8.456545646, true, 'fff'];
console.log(roundNumericValuesInArray(simpleArray, 2)); 
//["5.45", "8.46", true, "fff"]

适用于一维数组,但当数组包含另一个数组作为其元素时,此代码将无法正常工作,内部数组中的值不会被四舍五入:

var twoDimensionalArray = [5.48878533, 4.8798765, [5.4843, 9.498787878, 'fff'], 5.4852, true];
console.log(roundNumericValuesInArray(twoDimensionalArray, 2));
// ["5.49", "4.88", [5.4843, 9.498787878, 'fff'], "5.49", true]

如果 elem 是数组,我已经尝试通过递归调用 round() 函数来解决这个问题,如下所示:

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

function roundNumericValuesInArray(array, precision){
    var roundedArray = [];

    array.forEach(function round(elem){
        if(isNumber(elem)) {
            roundedArray.push(elem.toFixed(precision));
        } else if(elem.constructor === Array){
            round(elem);
        } else {
            roundedArray.push(elem);
        }
    })

    return roundedArray;
}

但是解释器抛出“RangeError: Maximum call stack size exceeded”,所以变成了无限循环什么的:

var twoDimensionalArray = [5.48878533, 4.8798765, [5.4843, 9.498787878, 'fff'], 5.4852, true];
console.log(roundNumericValuesInArray(twoDimensionalArray, 2));
//Maximum call stack size exceeded

这就是问题所在:多维数组中数值元素的取整值,无论它们有多深。

输出

[5.48878533, 4.8798765, [5.4843, 9.498787878, 'fff'], 5.4852, true]

应该是这样的

[5.48, 4.87, [5.48, 9.49, 'fff'], 5.48, true]

【问题讨论】:

    标签: javascript arrays multidimensional-array rounding


    【解决方案1】:

    如果是数组,则将其传递给roundNumericValuesInArray(),并将结果推送到roundedArray

    if(elem.constructor === Array){
        roundedArray.push(roundNumericValuesInArray(elem, precision));
    }
    

    function isNumber(n) {
      return !isNaN(parseFloat(n)) && isFinite(n);
    }
    
    function roundNumericValuesInArray(array, precision){
        var roundedArray = [];
    
        array.forEach(function round(elem){
            if(isNumber(elem)) {
                roundedArray.push(elem.toFixed(precision));
            } else if(elem.constructor === Array){
                roundedArray.push(roundNumericValuesInArray(elem, precision));
            } else {
                roundedArray.push(elem);
            }
        })
    
        return roundedArray;
    }
    
    var twoDimensionalArray = [5.48878533, 4.8798765, [5.4843, 9.498787878, 'fff', [1.2345, 2]], 5.4852, true];
    console.log(roundNumericValuesInArray(twoDimensionalArray, 2));

    【讨论】:

      【解决方案2】:

      您可以对给定的数组使用迭代和递归方法。

      如果找到一个数组,则返回该数组的结果进行映射。

      function isNumber(n) {
          return !isNaN(parseFloat(n)) && isFinite(n);
      }
      
      function roundNumericValuesInArray(array, precision) {
          return array.map(function iter(a) {
              if (Array.isArray(a)) {
                  return a.map(iter);
              }
              if (isNumber(a)) {
                  return a.toFixed(precision);
              }
              return a;
          });
      }
      
      var twoDimensionalArray = [5.48878533, 4.8798765, [5.4843, 9.498787878, 'fff'], 5.4852, true];
      
      console.log(roundNumericValuesInArray(twoDimensionalArray, 2));
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-12
        • 1970-01-01
        • 1970-01-01
        • 2021-03-25
        • 2015-01-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多