JS как вернуть собак, которые соответствуют выбранной породе? - PullRequest
0 голосов
/ 21 декабря 2018

Я новичок в кодировании и не могу понять, почему мой код не работает.У кого-нибудь есть предложения, как это исправить?

Мне задают вопрос:

This function takes an array of dog objects and returns an array of the names of all the pugs.
E.g. [
  {name: 'Beatrice', breed: 'Lurcher'},
  {name: 'Max', breed: 'Pug'},
  {name: 'Poppy', breed: 'Pug'}
]
will return ['Max', 'Poppy']

Это код, который я написал;

function getPugNames(dogs) {    
    let pugs = []
    let reg = /(pug)/g
    for (let i = 0; i < dogs.length; i ++) {
        if(reg.test(dogs[i].bread)) {
            pugs.push[i].name
        }
    } return pugs
}

Мой код будет запущен против этого;

describe("getPugNames", () => {
    it("returns [] when passed []", () => {
        expect(getPugNames([])).to.eql([]);
    });

    it("returns an array of pug names when passed an array of dog objects", () => {
        const dogs = [
            { name: "Beatrice", breed: "Lurcher" },
            { name: "Max", breed: "Pug" },
            { name: "Poppy", breed: "Pug" }
        ];
        expect(getPugNames(dogs)).to.eql(["Max", "Poppy"]);
        const dogs2 = [
            { name: "Steven", breed: "Lurcher" },
            { name: "Daphne", breed: "Pug" },
            { name: "Sandy", breed: "Labrador" },
            { name: "Mike", breed: "Pug" },
            { name: "Spike", breed: "Pug" }
        ];
        expect(getPugNames(dogs2)).to.eql(["Daphne", "Mike", "Spike"]);
        const dogs3 = [
            { name: "Kevin", breed: "Labrador" },
            { name: "Patch", breed: "Rottweiler" },
            { name: "Miles", breed: "Lurcher" },
            { name: "Sandy", breed: "Pug" },
            { name: "Spot", breed: "Pug" },
            { name: "Josephine", breed: "Terrier" },
            { name: "Eric", breed: "Pug" }
        ];
        expect(getPugNames(dogs3)).to.eql(["Sandy", "Spot", "Eric"]);
    });
});

Это ошибка, которую мне дают;

enter image description here

Ответы [ 5 ]

0 голосов
/ 24 декабря 2018

В коде, который вы написали:

function getPugNames(dogs) {    
    let pugs = []
    let reg = /(pug)/g
    for (let i = 0; i < dogs.length; i ++) {
        if(reg.test(dogs[i].bread)) {
            pugs.push[i].name
        }
    } return pugs
}

У вас были некоторые опечатки и ошибки.Во-первых, вам действительно не нужно регулярное выражение для проверки породы собаки - см. Мое if утверждение:

if (dogs[i].breed == "Pug") {...}

(у вас также была опечатка - вы написали breed с a, как bread.)

Во-вторых, ваш синтаксис для Array.prototype.push() неверен - это должно быть так:

pugs.push(dogs[i].name);

Итакпосле того как вы все это сделали, ваш код должен выглядеть следующим образом:

function getPugNames(dogs) {
    let pugs = [];
    for (let i = 0; i < dogs.length; i++) {
        if (dogs[i].breed == "Pug") {
            pugs.push(dogs[i].name);
        }
    }
    return pugs;
}

Однако, если вы действительно хотите сделать код меньше и быстрее, вы можете использовать Array.prototype.filter() и Функции стрелки ES6 примерно так:

const getPugNames = (dogs) => dogs.filter(d => if (d.breed == "Pug") return d.name);
0 голосов
/ 21 декабря 2018

Я исправил вашу версию и создал более простую версию для вас.Вот так:

//corrected version
function getPugNames(dogs) {    
    var pugs = [];
    var reg = /pug/gi
    for (let i = 0; i < dogs.length; i ++) {
        reg.lastIndex = 0;
        if (reg.test(dogs[i].breed)) 
            pugs.push(dogs[i].name);
    };
    return pugs
}

//easier version:
var getPugNames2 = dogs=>dogs
    .map(d=>d.breed.toLowerCase() == "pug" ? d.name : null)                    
    .filter(e=>e);

const dogs1 = [
    { name: "Beatrice", breed: "Lurcher" },
    { name: "Max", breed: "Pug" },
    { name: "Poppy", breed: "Pug" }
];
const dogs2 = [
    { name: "Steven", breed: "Lurcher" },
    { name: "Daphne", breed: "Pug" },
    { name: "Sandy", breed: "Labrador" },
    { name: "Mike", breed: "Pug" },
    { name: "Spike", breed: "Pug" }
];
const dogs3 = [
    { name: "Kevin", breed: "Labrador" },
    { name: "Patch", breed: "Rottweiler" },
    { name: "Miles", breed: "Lurcher" },
    { name: "Sandy", breed: "Pug" },
    { name: "Spot", breed: "Pug" },
    { name: "Josephine", breed: "Terrier" },
    { name: "Eric", breed: "Pug" }
];

console.log(getPugNames([]));
console.log(getPugNames(dogs1));
console.log(getPugNames(dogs2));
console.log(getPugNames(dogs3));
console.log(getPugNames2([]));
console.log(getPugNames2(dogs1));
console.log(getPugNames2(dogs2));
console.log(getPugNames2(dogs3));

У вас были ошибки.

  • Сначала у вас есть опечатка в породе.Вы написали «хлеб» вместо.
  • вы должны установить reg.lastIndex = 0, поскольку регулярное выражение, вызванное несколько раз, может вернуть разные результаты
  • у вас возникла синтаксическая ошибка при нажатии,
  • регулярное выражение должно быть без учета регистра

Надеюсь, это поможет вам.

0 голосов
/ 21 декабря 2018

pugs.push[i].name - ошибка.Вы должны иметь pugs.push(dogs[i].name);.

Кроме того, вам не нужно регулярное выражение для pug.Просто проверьте, как это:

if (dogs[i].breed.toLowerCase() === "pug")

0 голосов
/ 21 декабря 2018

Ваше регулярное выражение /(pug)/g, где оно должно быть /(Pug)/g.Но на мой взгляд, если даже не нужно использовать Regex.При прямом сравнении строк вы можете использовать оператор сравнения == или ===.Другая проблема в вашем коде - это то, как вы толкаете массив.Должно быть pugs.push(dogs[i].name), а не pugs.push[i].name.Поэтому это мое предложение:

function getPugNames(dogs) {

  let pugs = []
  for (let i = 0; i < dogs.length; i ++) {
    if(dogs[i].bread === 'Pug') {
      pugs.push(dogs[i].bread)
    }
  } 

  return pugs
}
0 голосов
/ 21 декабря 2018

Вы только что создали некоторый массив имен, вам нужны имена мопсов, вы можете использовать фильтр вашего массива, как pugs.filter (p => p.breed === 'pug'), это даст вам массив только с pugэлементы (проверьте документацию фильтра), чем просто взять имя из него, используя карту, map преобразует ваш массив в соответствии с заданной функцией обратного вызова, которая принимает элемент массива и должна возвращать новый элемент (проверьте array.map)

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