2017-05-13 23 views
1

我需要以給定的精度舍入數組中的值。數組可以包含任何數據類型,因此非數值應該按原樣存在。的exaple爲陣列,其中兩位小數需要:javascript:N維數組的圓形數值

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] 

我tryied如果ELEM是數組,這樣圓形的遞歸調用來解決這個()函數:

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] 

768,16是這樣

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

回答

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

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