Я мог бы написать что-то вроде этого:
const recToObj = rec => rec.split(/\s*-\s*/).slice(1).reduce((o, p) => {
const [k, v] = p.split(/:\s*/)
return {...o, [k]: v}
}, {})
const higherSalary = (a, b) => a ? a.Salary > b.Salary ? a : b : b
const listToObj = (records) => {
const objs = records.map(recToObj)
return objs.reduce((o, v) => ({...o, [v.Name]: higherSalary(o[v.Name], v)}), {})
}
const list = [
"Record - Name: Peter - Salary: 100000 - Position: Accountant - Date: February 15, 2018, 1:15 PM",
"Record - Name: Peter - Salary: 120000 - Position: Accountant - Date: February 15, 2019, 1:15 PM",
"Record - Name: Jonny - Salary: 90000 - Position: Developer - Date: February 15, 2019, 1:15 PM",
"Record - Name: Peter - Salary: 100000 - Position: Accountant - Date: February 15, 2018, 1:15 PM"
];
console.log(listToObj(list))
Обратите внимание, что recToObj
немного менее универсален, чем мы могли бы надеяться из-за присутствия начального токена "Record"
в строках.Но это, по крайней мере, позволяет вам добавлять дополнительные поля, не делая одноразовых ответов в вопросе.
И если бы Haskell наложил эмбарго на использование пробелов в Javascript, я мог бы написать это так:
const recToObj = rec => rec.split(/\s*-\s*/).slice(1).reduce((o, p, _, $, [k, v] = p.split(/:\s*/)) => ({...o, [k]: v}), {})
const higherSalary = (a, b) => a ? a.Salary > b.Salary ? a : b : b
const listToObj = (rs) => rs.map(recToObj).reduce((o, v) => ({...o, [v.Name]: higherSalary(o[v.Name], v)}), {})
: -)