通过数组属性重复数组对象元素

时间:2018-02-04 21:01:44

标签: javascript lodash

我的问题就是这样;我有一系列课程,每个课程都有自己的名字和课程组成的课程(每节课都有自己的日子)。

即:

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是我的选择。

3 个答案:

答案 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中,您可以使用reducemap和解构来获得此解决方案:



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; }