Может кто-нибудь объяснить, как правильно написать эту функцию Javascript? - PullRequest
0 голосов
/ 12 июля 2020

Я ищу кого-нибудь, чтобы показать мне, где я ошибся. Инструкции следующие:

Напишите следующую функцию (используйте массив песен, чтобы определить, что возвращать). getSongsNamesByArtist - эта функция ожидает строку в качестве аргумента и возвращает массив, содержащий имена только тех песен в массиве песен, свойства исполнителя которых равны строке, которая ей передана.

Итак, я сделал следующее:

let songs = [];
function createSong(name, artist) {
    let song = {
        name: name,
        artist: artist
    }
    songs.push(song);

    return song;
}
              
var heroes = new createSong("Heroes", "Bowie");
var jubileeStreet = new createSong("Jubilee Street", "Nick Cave");
var buena = new createSong("Buena", "Morphine");
var changes = new createSong("Changes", "Bowie");
var belaLugosi = new createSong("Bela Lugosi is Dead", "Bauhaus");



// I could get only this far:

function getSongsNamesByArtist(artist) {
  let names = [];
  for (let i = 0; i < songs.length; i++) {
    let song = songs[i];
    if (song.artist === artist) {
      names.push(song.name);
      return names;
    }
  }
}


console.log(getSongsNamesByArtist("Bowie")) // returns: [ 'Heroes' ], but not both of them.

Подскажите, пожалуйста, в чем я ошибся? Спасибо за уделенное время!

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Проблема в том, что вы делаете ранний возврат в операторе if. Поэтому, как только вы найдете совпадение, вы вернете результат.

function getSongsNamesByArtist(artist) {
  let names = [];
  for (let i = 0; i < songs.length; i++) {
    let song = songs[i];
    if (song.artist === artist) {
      names.push(song.name);
      return names; // <- here is your problem
    }
  }
}

Вместо этого вы хотите вернуться после l oop.

function getSongsNamesByArtist(artist) {
  let names = [];
  for (let i = 0; i < songs.length; i++) {
    let song = songs[i];
    if (song.artist === artist) {
      names.push(song.name);
    }
  }

  return names; // <- here is where you should return
}

Вы также можете рассмотреть возможность рефакторинга эта функция с функцией filter и map в JS

function getSongsNamesByArtist(artist) {
  return songs.filter((song) => {
    
    // Filter out the artist you are looking for
    return song.artist === artist;
  }).map((song) => {

    // Reformat your output to only contain the name of the song
    return song.name; 
  });
}
0 голосов
/ 12 июля 2020

Вы возвращались, как только было найдено первое совпадение. Вы должны сделать это снаружи за l oop. Обновите свой метод, как показано ниже

let songs = [];
function createSong(name, artist) {
    let song = {
        name: name,
        artist: artist
    }
    songs.push(song);

    return song;
}
              
var heroes = new createSong("Heroes", "Bowie");
var jubileeStreet = new createSong("Jubilee Street", "Nick Cave");
var buena = new createSong("Buena", "Morphine");
var changes = new createSong("Changes", "Bowie");
var belaLugosi = new createSong("Bela Lugosi is Dead", "Bauhaus");



// I could get only this far:

function getSongsNamesByArtist(artist) {
  let names = [];
  for (let i = 0; i < songs.length; i++) {
    let song = songs[i];
    if (song.artist === artist) {
      names.push(song.name);
      
    }
  }
return names;
}


console.log(getSongsNamesByArtist("Bowie"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...