Только отображать реальное значение из сложного массива JavaScript

Этот вопрос похож на один из моих предыдущих вопросов ( удаление объектов в объекте в массиве javascript). Однако вместо того, чтобы иметь только числа, существуют также комплексные числа с "NaN" в качестве реальных значений. Я думал, что это может произойти, так как я использую большие числа и Mathjs, но все остальные мои значения уже смещены до ~15 десятичных знаков. Возвращенный массив из консоли console.log(realPowers) в журнале консоли выглядит следующим образом:

0:0
1:91.51069578156118
2:183.02210760273937
3:277.73380284266796
4:376.47588381083307
5:481.85928667762994
6:599.6533611633058
7:752.8633763048005
8:Complex {re: NaN, im: -0.015021590179814361}
9:Complex {re: NaN, im: -0.029563247908981544}
10:Complex {re: NaN, im: -0.047829041780228475}

Это интересно, поскольку первая строка кода ниже должна возвращать только действительные значения комплексных чисел. Я пытаюсь передать эти значения в цикл for, используя метод toFixed, чтобы уменьшить количество десятичных разрядов:

var realPowers = results.totalPower.map((x) => x && x.re ? x.re :x);

function fixPowers(realPowers) {

  var k,fixedPower,powerToFix

  for (k=0,fixedRealPowers=[]; k < realPowers.length; k++) {
    powerToFix = realPowers[k];
    fixedPower = powerToFix.toFixed(3);
    fixedRealPowers.push(fixedPower);
  }
  return fixedRealPowers
};

Где totalPower - исходный массив. Но когда я делаю это, он возвращает ошибку:

powerToFix.toFixed is not a function

поскольку toFixed не может быть использован для строки (я предполагаю).

Я пытаюсь сделать массив, который выглядит так:

0:0
1:91.51069578156118
2:183.02210760273937
3:277.73380284266796
4:376.47588381083307
5:481.85928667762994
6:599.6533611633058
7:752.8633763048005
8:NaN
9:NaN
10:NaN

Могу ли я уменьшить количество десятичных знаков для действительных чисел и сохранить только NaN часть комплексных чисел, используя тот же или аналогичный метод?

2 ответа

Решение

Проблема в том, что NaN считается фальшей в Javascript, поэтому x && x.re является falsey для комплексных чисел с re: NaN, Потом возвращается x, который является целым комплексным числом. Если вы хотите проверить, существует ли свойство, используйте hasOwnProperty() метод.

function Complex(real, imag) {
  return {re: real, im: imag};
}
var results = {
  totalPower: [
    0,
    91.51069578156118,
    183.02210760273937,
    277.73380284266796,
    376.47588381083307,
    481.85928667762994,
    599.6533611633058,
    752.8633763048005,
    Complex(NaN, -0.015021590179814361),
    Complex(NaN, -0.029563247908981544),
    Complex(NaN, -0.047829041780228475)
  ]
};

var realPowers = results.totalPower.map((x) => x && x.hasOwnProperty('re') ? x.re :x);

function fixPowers() {

  var k,fixedPower,powerToFix

  for (k=0,fixedRealPowers=[]; k < realPowers.length; k++) {
    powerToFix = realPowers[k];
    fixedPower = powerToFix.toFixed(3);
    fixedRealPowers.push(fixedPower);
  }
  return fixedRealPowers
};

console.log(fixPowers());

var realPowers = results.totalPower.map((x) => x && x.re ? x.re :x);

function fixPowers(totalPower) {

  var k,fixedPower,powerToFix

  for (k=0,fixedRealPowers=[]; k < realPowers.length; k++) {
    powerToFix = realPowers[k];

    fixedPower = isNaN(powerToFix) ? powerToFix : powerToFix.toFixed(3);
    fixedRealPowers.push(fixedPower);
  }
  return fixedRealPowers
};
Другие вопросы по тегам