Это вполне себе нормальный подход. Встречал такое (param1,param2) даже в крупных энтерпрайз решениях, т.к. не всегда можно альтер тейбл эффективно выполнить, чтобы добавить поле, и (или) ваш кейс, когда есть набор атрибутов которые свойственны части сущностей и не пересекаются.
Только маппинг для каждой сущности я бы вынес отдельно:
var productToExtraMap = {
'tv' : {
matrix : 'extra_1',
remoteControl : 'extra_2'
},
'dvd' : {
...
}
}
и по такой мапе собирать объекты.
Тогда у вас будет 1 место где собирается объект и 1 место где декларируется маппинг. Не будет лишних вложенных ифов и т.п.
П.С. Мапу можно и по другому развернуть, это уже как вам удобнее.