JS как вернуть собак, которые соответствуют выбранной породе?

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

Вопрос, который мне дали, заключается в следующем;

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"]);
    });
});

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

5 ответов

pugs.push[i].name это ошибка У тебя должно быть pugs.push(dogs[i].name);,

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

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

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

В коде вы написали:

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 с, как 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);

Вы регулярное выражение /(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
}

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

//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 потому что регулярное выражение, вызванное несколько раз, может вернуть разные результаты
  • у вас была ошибка синтаксиса при нажатии,
  • регулярное выражение должно быть без учета регистра

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

Другие вопросы по тегам