Вы не хотите использовать .map()
, так как это просто создаст другой массив с сопоставленными элементами в той же позиции, что и в исходном массиве. Вместо этого, если вы все еще хотите использовать методы функционального программирования, вы должны использовать .reduce()
, который перебирает массив и накапливает из него результат. Вот один из способов сделать это, который мутирует объект результата:
const incidenceRules = (rules: Rule[]): IncidenceRules =>
rules.reduce<IncidenceRules>(
(a, rule) => (a[rule.severity] = { ruleObj: rule, text: rule.text }, a),
{}
);
Вы можете видеть, что он делает то, что я думаю, что вы хотите:
console.log(JSON.stringify(
incidenceRules([new Rule("a", 1), new Rule("b", 2)]), undefined, 2));
/* {
"1": {
"ruleObj": {
"text": "a",
"severity": 1
},
"text": "a"
},
"2": {
"ruleObj": {
"text": "b",
"severity": 2
},
"text": "b"
}
}*/
Если вы не считаете мутацию приемлемой вместо этого вы можете использовать распространение объекта для создания новых объектов результатов на каждом шаге:
const incidenceRulesImmutable = (rules: Rule[]): IncidenceRules =>
rules.reduce<IncidenceRules>(
(a, rule) => ({ ...a, [rule.severity]: { ruleObj: rule, text: rule.text } }),
{}
);
Это равносильно тому же; лично я не вижу ничего плохого в использовании императива l oop:
const incidenceRulesImperative = (rules: Rule[]): IncidenceRules => {
const ret: IncidenceRules = {};
for (const rule of rules) {
ret[rule.severity] = { ruleObj: rule, text: rule.text }
};
return ret;
}
В любом случае, надеюсь, это поможет; удачи!
Детская площадка ссылка на код