Я думаю, что вы путаете массив объектов со словарем. Я включил обе версии ниже, чтобы показать разницу.
То, что вы хотите сделать с данными, это отобразить их, а не уменьшить.
let allEmployees = [
{ "Id": 1374, "FirstName": "John", "LastName": "Doe" },
{ "Id": 1375, "FirstName": "Jane", "LastName": "Doe" }
];
let defaultOptions = {
keyField: 'Id',
valueFn: (emp) => `${emp['FirstName']} ${emp['LastName']}`
};
console.log('Dictionary', toDictionary(allEmployees, defaultOptions));
console.log('Pairs', toPairs(allEmployees, defaultOptions));
function toDictionary(list, options) {
let opts = Object.assign({ keyField: 'key', valueField: 'value' }, options);
return list.reduce((dict, item) => (Object.assign(dict, {
[item[opts.keyField]] : opts.valueFn ? opts.valueFn(item) : item[opts.valueField]
})), {});
}
function toPairs(list, options) {
let opts = Object.assign({ keyField: 'key', valueField: 'value' }, options);
return list.map((item) => ({
key : item[opts.keyField],
value : opts.valueFn ? opts.valueFn(item) : item[opts.valueField]
}));
}
.as-console-wrapper { top: 0; max-height: 100% !important; }
Вот класс оболочки списка.
class ListWrapper {
constructor(list, options) {
this.list = list;
this.keyField = options.keyField || 'key'
this.valueField = options.valueField || 'value'
this.valueFn = options.valueFn /* optional */
}
toPairs() {
return this.list.map(e=>({key:e[this.keyField],value:this.valueFn?this.valueFn(e):e[this.valueField]}));
}
toDictionary() {
return this.list.reduce((d,e)=>(Object.assign(d,{[e[this.keyField]]:this.valueFn?this.valueFn(e):e[this.valueField]})),{});
}
}
let allEmployees = [
{ "Id": 1374, "FirstName": "John", "LastName": "Doe" },
{ "Id": 1375, "FirstName": "Jane", "LastName": "Doe" }
];
let listWrapper = new ListWrapper(allEmployees, {
keyField: 'Id',
valueFn: (emp) => `${emp['FirstName']} ${emp['LastName']}`
});
console.log('Dictionary', listWrapper.toDictionary());
console.log('Pairs', listWrapper.toPairs());
.as-console-wrapper { top: 0; max-height: 100% !important; }