Умножение на 2 объекта, которые могут иметь вариацию в одной метке в NodeJS / Express - PullRequest
0 голосов
/ 05 мая 2020

У меня есть 2 объекта:

totalGridConso [ 
  { horoseason: 'HPH', value: 0 },
  { horoseason: 'HCH', value: 0 },
  { horoseason: 'HPE', value: 3498.54 },
  { horoseason: 'HCE', value: 4460.99 }
]


billedkWh [ 
  { horoseason: 'BASE', value: NaN },
  { horoseason: 'HPH', value: 8.4370003 },
  { horoseason: 'HCH', value: 5.5939999 },
  { horoseason: 'HPB', value: 5.0570002 },
  { horoseason: 'HCB', value: 3.3499999 }
]

Важно отметить, что я могу сопоставить HPE с HPB и HCE с HCB, это похоже на старую этикетку, и новый ярлык, но значение то же самое.

Теперь я хотел бы сделать

const HTVar = billedkWh.map(x => {
            const HTVal = totalGridConso.find(it => hasSameHoroseason(it, x))
            return {
                horoseason: x.horoseason,
                value: typeof HTVal != 'undefined' ? HTVal.value * x.value / 100 : null
            }
        })

Так что я могу получить что-то похожее на: hasSameHoroseason(it, x)

function hasSameHoroseason(it, x) {
    // In files, sometime the we find HPB, sometimes we find HPE
    // In files, sometime the we find HCB, sometimes we find HCE
    return it.horoseason === x.horoseason
        || (it.horoseason === "HPE" && it.horoseason === "HPB")
        || (it.horoseason === "HPB" && it.horoseason === "HPE")
        || (it.horoseason === "HCE" && it.horoseason === "HCB")
        || (it.horoseason === "HCB" && it.horoseason === "HCE")
        ;
}

Результат должен быть

result [ 
  { horoseason: 'BASE', value: null },
  { horoseason: 'HPH', value: 0 },
  { horoseason: 'HCH', value: 0 },
  { horoseason: 'HPE', value: 176.92 }, // 3498.54×5.057÷100
  { horoseason: 'HCE', value: 14944.2718901 } // 4460.99×3,34999÷100
]

Но я получаю:

undefined
{ horoseason: 'HPH', value: 0 }
{ horoseason: 'HCH', value: 0 }
undefined
undefined

Что мне не хватает?

1 Ответ

1 голос
/ 05 мая 2020

Проблема в этом коде

return it.horoseason === x.horoseason
    || (it.horoseason === "HPE" && it.horoseason === "HPB")
    || (it.horoseason === "HPB" && it.horoseason === "HPE")
    || (it.horoseason === "HCE" && it.horoseason === "HCB")
    || (it.horoseason === "HCB" && it.horoseason === "HCE")

Когда вы пытаетесь сопоставить разные значения, вы фактически проверяете свойство на it оба раза, поэтому код пытается проверить, равно ли it.horoseason одновременно на "HPE" и "HPB".

Правильный лог c - это проверить оба объекта:

return it.horoseason === x.horoseason
    || (it.horoseason === "HPE" && x.horoseason === "HPB")
    || (it.horoseason === "HPB" && x.horoseason === "HPE")
    || (it.horoseason === "HCE" && x.horoseason === "HCB")
    || (it.horoseason === "HCB" && x.horoseason === "HCE")

Если вам нужно добавить больше случаев в в будущем вы можете улучшить это, добавив таблицу равенств. Это поможет, так как его легче поддерживать:

function hasSameHoroseason(it, x) {
    const commonHPE_HPB = Symbol("HPE_HPB");
    const commonHCE_HCB = Symbol("HCE_HPB");
    const tableOfEqualities = {
      "HPE": commonHPE_HPB,
      "HPB": commonHPE_HPB,
      "HCE": commonHCE_HCB,
      "HCB": commonHCE_HCB
    }
    const itNormalised = tableOfEqualities[it.horoseason] || it.horoseason;
    const xNormalised = tableOfEqualities[x.horoseason] || x.horoseason;
    return itNormalised === xNormalised;
}

test("foo", "bar") //false
test("HPE", "bar") //false
test("HPE", "HPE") //true
test("HPE", "HPB") //true
test("HCE", "HCB") //true
test("HPE", "HCB") //false

function test(a, b) {
  console.log(`Values:
    "${a}"
    "${b}" 
considered equal:`, 
    hasSameHoroseason( 
      { horoseason: a },
      { horoseason: b }
    )
  )
}

Шаг нормализации сопоставит HPE и HPB с одним и тем же значением, чтобы их можно было напрямую преобразовать. То же самое с HCE / HCB. Я использовал здесь символ , так как он вполне уместен, таким образом вы никогда не столкнетесь с другими значениями.

Вы также можете извлечь logi нормализации c, а также таблица значений отдельно, и вам нужно только добавить элементы в таблицу таким образом, вам никогда не придется изменять фактический алгоритм.

const commonHPE_HPB = Symbol("HPE_HPB");
const commonHCE_HCB = Symbol("HCE_HPB");
const tableOfEqualities = {
  "HPE": commonHPE_HPB,
  "HPB": commonHPE_HPB,
  "HCE": commonHCE_HCB,
  "HCB": commonHCE_HCB
}

function normalise(val) {
  return tableOfEqualities[val] || val;
}

function hasSameHoroseason(it, x) {
    const itNormalised = normalise(it.horoseason);
    const xNormalised = normalise(x.horoseason);
    return itNormalised === xNormalised;
}

test("foo", "bar") //false
test("HPE", "bar") //false
test("HPE", "HPE") //true
test("HPE", "HPB") //true
test("HCE", "HCB") //true
test("HPE", "HCB") //false

function test(a, b) {
  console.log(`Values:
    "${a}"
    "${b}" 
considered equal:`, 
    hasSameHoroseason( 
      { horoseason: a },
      { horoseason: b }
    )
  )
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...