Проблема в этом коде
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 }
)
)
}