Как динамически строить вложенные объекты - PullRequest
0 голосов
/ 18 октября 2019

Я получаю данные из API и хочу отформатировать данные так, чтобы их могла прочитать клиентская сторона.

Я попытался использовать следующий код для создания объекта, но он выглядит хакерским и не заботится о крайних случаях.

function myHackyFunction(data){
result = {}

data.forEach(el => {
        const timeStamp = el['time']
        result[timeStamp] = { teacher: null, student: null }
    })
data.forEach(el => {
        const role = el['role']
        const timeStamp = el['time']
        const age = el['age']
        if (role.includes('teacher')) {
            result[timeStamp].teacher = age
        }
        if (role.includes('student')) {
            result[timeStamp].student = age
        }
    })
  return result
}
myHackyFunction(data)

Переменная данных будет иметь разную длину, но всегда одинаковую настройку. Иногда она включает в себя роли student и teacher, иногда только одну из них.

эти данные ..

const data = [
  {
    time: 2019,
    role: 'student',
    age: 22
  },
  {
    time: 2019,
    role: 'teacher',
    age: 37
  },
  {
    time: 2020,
    role: 'teacher',
    age: 45
  }
]

.. должны выглядеть следующим образом:

const desiredData = {
  2019: {
    student: 22,
    teacher: 37
  },
  2020: {
    student: null,
    teacher: 45
  }
}

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Найдите решение проблемы ниже:

console.clear()

const data = [
  {
    time: 2019,
    role: 'student',
    age: 22
  },
  {
    time: 2019,
    role: 'teacher',
    age: 37
  },
  {
    time: 2020,
    role: 'teacher',
    age: 45
  }
]

const m = {}
const len = data.length

for (let i = 0; i < len; ++i) {
    if (!m[data[i].time]) m[data[i].time] = {student: null, teacher: null}
  if (data[i].role === 'student')
    m[data[i].time].student = data[i].age
  else if (data[i].role === 'teacher')
    m[data[i].time].teacher = data[i].age 
}

console.log(m)

Примечание : Это будет работать только в том случае, если в данном году есть один студент / учитель, в противном случае значение будет переопределено.

0 голосов
/ 18 октября 2019

Всякий раз, когда вы видите данные, которые похожи на вашу группировку и т. Д., Array.reduce обычно подходит для счета.

например.

const data = [
  {
    time: 2019,
    role: 'student',
    age: 22
  },
  {
    time: 2019,
    role: 'teacher',
    age: 37
  },
  {
    time: 2020,
    role: 'teacher',
    age: 45
  }
];
//..should look like:

const desiredData = data.reduce((a, v) => {
  a[v.time] = a[v.time] || {student: null, teacher: null};
  a[v.time][v.role] = v.age;
  return a;
}, {});

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