我的问题就是这样;我有一系列课程,每个课程都有自己的名字和课程组成的课程(每节课都有自己的日子)。
即:
courses = [
{name: 'Math', lessons: [{day: 'Wednesday'}, {day: 'Thursday'}]},
{name: 'Sports', lessons: [{day: 'Monday'}]}
]
我想要的结果是:
courses_flattened = [
{name: 'Math', lesson: {day: 'Wednesday'}},
{name: 'Math', lesson: {day: 'Thursday'}},
{name: 'Sports', lesson: {day: 'Monday'}}
]
目前我正在做的是使用array.map迭代课程,然后对于每个课程,我将返回一个包含所有课程时间的数组。 收到数组后,我正在使用:
courses_flattened = [].concat.apply([], courses_flat)
获取一个由所有课程组成的数组,每个课程包含1节课。
完整代码:
courses_flat = courses.map((course) -> {
var lessons = [];
course.lessons.forEach((lesson) -> {
lessons.push({name: course.name, lesson: {day: lesson.day}})
});
return lessons;
});
有没有更好的方式来接受这种结果?
使用Lodash是我的选择。
答案 0 :(得分:2)
可以使用flatMap
重写嵌套循环。它不是内置在JS中,但您可以像这样轻松定义它:
let flatMap = (a, fn) => [].concat(...a.map(fn));
(请注意,这基本上是您的[].concat.apply
事。)
然后
courses_flattened = flatMap(courses, ({name, lessons}) =>
lessons.map(lesson => ({name, lesson})));
使用lodash它是一样的:
courses_flattened = _.flatMap(courses, ({name, lessons}) =>
_.map(lessons, lesson => ({name, lesson})));
答案 1 :(得分:1)
const courses = [
{name: 'Math', lessons: [{day: 'Wednesday'}, {day: 'Thursday'}]},
{name: 'Sports', lessons: [{day: 'Monday'}]}
];
const result = [];
for(const {name, lessons} of courses)
for(const {day} of lessons)
result.push({name, lesson: { day }});
console.log(result);
可能只使用两个嵌套for循环? (和对象解构)
答案 2 :(得分:0)
在普通的ES6 JavaScript中,您可以使用reduce
,map
和解构来获得此解决方案:
const courses = [{name: 'Math', lessons: [{day: 'Wednesday'}, {day: 'Thursday'}]},{name: 'Sports', lessons: [{day: 'Monday'}]}];
const result = courses.reduce( (acc, {name, lessons}) =>
acc.concat(lessons.map( lesson => ({ name, lesson }) ))
, []);
console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }