Переформатировать строки в работоспособный формат данных - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть массив строк, я ищу лучший способ переформатировать следующие данные в рабочий формат

const list = ["Record - Name: Peter - Salary: 100000 - Position: Accountant - Date: February 15, 2019, 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, 2019, 1:15 PM"]

Это то, что мне нужно:

  • Пройдите каждую строку и удалите дубликаты и оставьте только те, у которых Salary
  • выше, превратите их в объекты / массивы, чтобы я мог получить доступ к каждому свойству позже, например, object.name

Это то, что у меня есть, это работает, но я надеюсь, что есть лучший способ сделать это?

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"
];

const newList = list.map(donation => {
  const a = donation.split(' - ');
  const name = a[1].split(': ')[1];
  const salary = a[2].split(': ')[1];
  const position = a[3].split(': ')[1];
  const date = a[4].split(': ')[1];
  return { name, salary, position, date };
});

console.log('newList: \n', JSON.stringify(newList, null, 4));
console.log("\n");

let obj = {};
newList.forEach(current => {
  let index = current['name'];
  if (obj[index]) {
    if (obj[index]['name'] === current['name']) {
      if (+obj[index]['salary'] < +current['salary']) {
        obj[index] = current;
      }
    }
  } else {
    obj[index] = current;
  }
})

console.log('Result: \n', JSON.stringify(obj, null, 4));

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Я мог бы написать что-то вроде этого:

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)}), {})

: -)

0 голосов
/ 16 февраля 2019

Вы можете сделать что-то вроде этого, используя Array # from, Array # lower, String # split, Match String #, деструктуризацию, синтаксис распространения и регулярное выражение.

const data = [
  "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"
];

const res = Array.from(
  data.reduce((m,str)=>{
    const {Name, Salary, ...rest} = str
      .match(/(?![Record])(\w+\s*:((\s|,|:)*\w|\d)+)/g)
      .reduce((a,c)=>{
        const [k,v] = c.split(/:\s?(?!\d)/)
        a[k] = v;
        return a;
      }, {});

    const record = m.get(Name);
    if(!record ||record.Salary < Salary) return m.set(Name, {Name, Salary, ...rest});
    else return m;
  }, new Map()).values()
);

console.log(res);
0 голосов
/ 15 февраля 2019

Вы можете использовать map и reduce, чтобы сначала создать массив объектов, а затем еще один reduce, чтобы получить объект максимальной зарплаты для каждого имени.

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"
];

const data = list.map(rec => {
  return rec.replace(/ /g, '').split('-').slice(1)
    .reduce((r, e) => {
      let [key, value] = e.split(':')
      r[key.toLowerCase()] = value
      return r;
    }, {})
})

const filtered = data.reduce((r, e) => {
  if (!r[e.name]) r[e.name] = e;
  else if (r[e.name].salary < e.salary) r[e.name] = e
  return r
}, {})

console.log(Object.values(filtered))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...