2017-05-13 3 views
1

配列の値を指定した精度で丸める必要があります。配列には任意のデータ型を含めることができるので、非数値の値はそのままの値にする必要があります。 2つの小数が必要なアレイの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] 

私はelemは、このような配列である場合、ラウンドの再帰呼び出し()関数でこの問題を解決するためにtryiedました:

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] 

答えて

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

ようになりshoud。

配列が見つかった場合は、配列の結果がマッピングのために返されます。アレイの場合

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

関連する問題