Вы можете использовать map
и filter
следующим образом:
const selectedCourse = [ { "courseType": [5], "id": 26, "title": "Apple Tart with Apricot Glaze", }, { "courseType": [3], "id": 16, "title": "Classic Caesar Salad", }, { "courseType": [1,2], "id": 10, "title": "Lobster Bisque", }, { "courseType": [3], "id": 16, "title": "Classic Caesar Salad", }, ]
const courseTypes = [ {name: "Hors d'oeuvres", id: 0}, {name: "Soup", id: 1}, {name: "Fish", id: 2}, {name: "Salad", id: 3}, {name: "Main course", id: 4}, {name: "Dessert", id: 5} ];
const result = courseTypes.map(courseType => ({
courseType: courseType.id,
courseName: courseType.name,
courses: selectedCourse.filter(course => course.courseType.includes(courseType.id))
})).filter(extended => extended.courses.length);
console.log(JSON.stringify(result, null, 2));
Объяснение:
courseTypes.map
выполняет итерацию по вашему второму входному массиву и для каждого типа, который он находит в selectedCourse
, какие курсы соответствуют этому конкретному типу.
Он использует .filter
для сбора этих совпадений.Обратный вызов filter
использует includes
для определения совпадения - он возвращает логическое значение, именно то, что обратный вызов фильтра ожидает в качестве возвращаемого значения.
Этот фильтрованный массив затем добавляется к литералу объекта, которыйтакже определяет два других свойства courseType
и courseName
.Этот новый объект - то, на что отображается тип курса.courseTypes.map
возвращает массив этих объектов.
Наконец, в результате могут быть записи с пустым массивом courses
.Те отфильтрованы с другим вызовом .filter
.Если length
этого массива courses
не равен нулю, объект сохраняется, в противном случае он исключается из результата.
Для более старых браузеров
Вот такой же кодсовместим со старыми браузерами (без функций стрелок, без includes
, которые были представлены в ES2015):
const selectedCourse = [ { "courseType": [5], "id": 26, "title": "Apple Tart with Apricot Glaze", }, { "courseType": [3], "id": 16, "title": "Classic Caesar Salad", }, { "courseType": [1,2], "id": 10, "title": "Lobster Bisque", }, { "courseType": [3], "id": 16, "title": "Classic Caesar Salad", }, ]
const courseTypes = [ {name: "Hors d'oeuvres", id: 0}, {name: "Soup", id: 1}, {name: "Fish", id: 2}, {name: "Salad", id: 3}, {name: "Main course", id: 4}, {name: "Dessert", id: 5} ];
const result = courseTypes.map(function (courseType) {
return {
courseType: courseType.id,
courseName: courseType.name,
courses: selectedCourse.filter(function (course) {
return course.courseType.indexOf(courseType.id) > -1;
})
};
}).filter(function (extended) {
return extended.courses.length;
});
console.log(JSON.stringify(result, null, 2));