как отформатировать массив объектов JSON (Javascript)

1

Я борюсь с жестким требованием, когда я не знаю, как бороться с

Я получил один массив, как показано ниже:

[{
    "student": "21_A_1",
    "sport": "badminton"
}, {
    "student": "21_C_1",
    "sport": "badminton"
}, {
    "student": "21_A_2",
    "sport": "badminton"
}, {
    "student": "21_B_1",
    "sport": "football"
}, {
    "student": "21_A_2",
    "sport": "football"
}]

Требование: преобразовать его в массив с форматом:

[{
    "student": "21_A_1",
    "sport": ["badminton"]
}, {
    "student": "21_C_1",
    "sport": ["badminton"]
}, {
    "student": "21_A_2",
    "sport": ["badminton","football"]
}, {
    "student": "21_B_1",
    "sport": ["football"]
}]

Я обнаружил, что библиотека lodash имеет функцию "group by", которая возвращает закрытый результат, но не как ожидание:

_.groupBy(array, 'student');

Результат:

{
    "21_A_1": [{
        "student": "21_A_1",
        "sport": "badminton"
    }],
    "21_C_1": [{
        "student": "21_C_1",
        "sport": "badminton"
    }],
    "21_A_2": [{
        "student": "21_A_2",
        "sport": "badminton"
    }, {
        "student": "21_A_2",
        "sport": "football"
    }],
    "21_B_1": [{
        "student": "21_B_1",
        "sport": "football"
    }]
}

Любое предложение очень ценится.

  • 0
    Лучше создать свой собственный алгоритм, чем использовать для этого lodash ...
Теги:
arrays
lodash

3 ответа

2
Лучший ответ

Вам нужно сопоставить сгруппированные предметы с их sport и построить новые объекты с информацией о группировке.

var array = [{ student: "21_A_1", sport: "badminton" }, { student: "21_C_1", sport: "badminton" }, { student: "21_A_2", sport: "badminton" }, { student: "21_B_1", sport: "football" }, { student: "21_A_2", sport: "football" }],
    grouped = _(array)
        .groupBy('student')
        .map((group, student) => ({ student, sport: _.map(group, 'sport') }))
        .value();

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
  • 0
    Большое спасибо за быстрые решения, все работают, однако я отметил, что это как ответ, потому что я использую lodash. Я не знаю, какие из них являются лучшими, поэтому, если вы, ребята, имеете какие-то лучшие практики, пожалуйста, продолжайте делиться ими Потому что в массиве может быть до тысячи элементов.
2

Мы можем использовать функцию ".reduce" для массива и совокупный результат, как показано ниже

var test = [{
    "student": "21_A_1",
    "sport": "badminton"
}, {
    "student": "21_C_1",
    "sport": "badminton"
}, {
    "student": "21_A_2",
    "sport": "badminton"
}, {
    "student": "21_B_1",
    "sport": "football"
}, {
    "student": "21_A_2",
    "sport": "football"
}]
const result = test.reduce((res,x)=>{
   res[x.student] = res[x.student] || { student:x.student,sport:[]}
   res[x.student].sport.push(x.sport)
   return res;
},{})

console.log(result)
0

Использование Array.prototype.reduce() в сочетании с Object.values():

const data = [{"student": "21_A_1","sport": "badminton"}, {"student": "21_C_1","sport": "badminton"}, {"student": "21_A_2","sport": "badminton"}, {"student": "21_B_1","sport": "football"}, {"student": "21_A_2","sport": "football"}];
const result = Object.values(
  data.reduce((a, c) => ((a[c.student] = a[c.student] || {student: c.student, sport: []}).sport.push(c.sport), a), {})
);

console.log(result);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню