Javascript教程,无法映射&减少以得到正确的答案

时间:2018-04-12 07:12:53

标签: javascript arrays nested reduce

我正在尝试完成本教程,但我无法弄清楚为什么教师给出的答案对我不起作用。

有一组用户(对象),每个用户都将favoriteBooks作为嵌套对象。

我们将使用map和reduce来创建一个包含所有用户所有喜爱书籍的数组。

我底部的代码是我目前所拥有的代码,但也是教师所说的解决方案。他的代码致力于创建精确的解决方案(在他的视频中)。

但是,我认为问题是当第二张地图发挥作用时,还有另一层嵌套数组可以通过。

有人可以对此有所了解吗?我无法理解我的生活。

谢谢!

Managing State in Apache Flink - Tzu-Li (Gordon) Tai

3 个答案:

答案 0 :(得分:1)

您需要使用reduce函数来展平嵌套数组和map函数,以便为reducer中的每个用户返回书名。然后最后使用一些扩展运算符,你可以填充reducer的累加器(arr)并得到整个列表。



const users = [
  {
    name: 'Samir',
    age: 27,
    favoriteBooks:[
      {title: 'The Iliad'},
      {title: 'The Brothers Karamazov'}
    ]
  },
  {
    name: 'Angela',
    age: 33,
    favoriteBooks:[
      {title: 'Tenth of December'},
      {title: 'Cloud Atlas'},
      {title: 'One Hundred Years of Solitude'}
    ]
  },
  {
    name: 'Beatrice',
    age: 42,
    favoriteBooks:[
      {title: 'Candide'}
    ]
  }
];

    // Result: ['The Iliad', 'The Brothers Karamazov', 'Tenth of December', 'Cloud Atlas', 'One Hundred Years of Solitude', 'Candide'];

const books = users
  .reduce((arr, user) => {
    const favBooks = user.favoriteBooks;
    
    return [...arr, ...favBooks.filter(el => (arr.indexOf(el.title) < 0)).map(el => el.title)];
  }, []);

console.log(books);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您可以使用array#map获取每个用户的favoriteBooks,然后使用array#concat将其展平为单个数组。然后使用array#map,获取所有title的数组。

&#13;
&#13;
const users = [ { name: 'Samir', age: 27, favoriteBooks:[ {title: 'The Iliad'}, {title: 'The Brothers Karamazov'} ] }, { name: 'Angela', age: 33, favoriteBooks:[ {title: 'Tenth of December'}, {title: 'Cloud Atlas'}, {title: 'One Hundred Years of Solitude'}] }, { name: 'Beatrice', age: 42, favoriteBooks:[ {title: 'Candide'} ] } ],
     titles = [].concat(...users.map(({favoriteBooks}) => favoriteBooks))
                .map(({title}) => title);
console.log(titles);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

const users = [
    {
        name: 'Samir',
        age: 27,
        favoriteBooks:[
            {title: 'The Iliad'},
            {title: 'The Brothers Karamazov'}
        ]
    },

    {
        name: 'Angela',
        age: 33,
        favoriteBooks:[
            {title: 'Tenth of December'},
            {title: 'Cloud Atlas'},
            {title: 'One Hundred Years of Solitude'}
        ]
    },
    {
        name: 'Beatrice',
        age: 42,
        favoriteBooks:[
            {title: 'Candide'}
        ]
    }
];

const array = users.reduce((arr, val) => {
    val.favoriteBooks.map ( (t) =>{
        arr.push(t.title)
    })
    return arr
}, []);

console.log( array)