javascript:N维数组的圆形数值

时间:2017-05-13 10:39:31

标签: javascript arrays multidimensional-array rounding

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

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"]

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

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:超出最大调用堆栈大小”,因此它变成无限循环或其他:

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]

2 个答案:

答案 0 :(得分:0)

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

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



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; }




答案 1 :(得分:0)

如果数组将其传递给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));