从数组返回多个值

时间:2019-05-01 22:21:40

标签: javascript arrays object ecmascript-6

这是一个作业问题。我需要编写一个名为“ allBy”的函数,该函数将(artist)作为参数。
运行时,此函数应返回给定艺术家的“收藏”中所有记录的数组。

我编写了一个仅返回一条记录,但不会返回多条记录的函数。

控制台日志是一项将记录添加到集合的功能。

 let collection = [];

 function addToCollection( title, artist, year) {
   collection.push({title, artist, year}); // adds album to array
   return {title, artist, year};  // returns newly created object
 } // end of addToCollection function     


 console.log( addToCollection('The Real Thing', 'Faith No More', 
 1989));
 console.log( addToCollection('Angel Dust', 'Faith No More', 
 1992));
 console.log( addToCollection( 'Nevermind', 'Nirvana', 1991));
 console.log( addToCollection( 'Vulgar Display of Power', 
 'Pantera', 1991));

 function allBy(artist) {
   for ( let i = 0; i < collection.length; i++) {
   // for ( disc of collection) {
       if (collection[i].artist === artist) {
         return [collection[i].title];
       }
     }
 }

我想以阵列的形式获取给定艺术家的所有记录,但是我只能得到一个。我什至不对此感兴趣吗?

2 个答案:

答案 0 :(得分:1)

主函数allBy()在看到第一个匹配的艺术家后立即返回。尝试声明一个空数组并存储在其中找到的匹配项,以便您可以在循环外返回该数组。

function allBy(artist) {

   var matches = []; // create an empty array to store our matches

   for ( let i = 0; i < collection.length; i++) {
       // console.log('current collection item: ', collection[i]); // optional: log or add a breakpoint here to understand what's happening on each iteration
       if (collection[i].artist === artist) {
         matches.push(collection[i].title); // add a match we've found
         // return [collection[i].title];
       }
   }

   return matches; // tada!
 }

答案 1 :(得分:1)

您可以将mapfilter一起使用:

function allBy(artist) {
    return collection.filter(({ artist: a }) => a == artist).map(({ title }) => title);
}