Вложенные циклы с массивами не работают должным образом - PullRequest
2 голосов
/ 08 мая 2020

Я пытаюсь выполнить sh следующее ...

Учитывая массив тортов как:

const cakes = [
    {id: 1, name: 'chocolate'},
    {id: 2, name: 'strawberry'},
    {id: 3, name: 'mint'}
]

И массив «любимые торты» как:

const favCakes = [
    {id: 1, cakeId: 1},
    {id: 2, cakeId: 2}
]

Я хочу регистрировать ЛЮБИМЫЕ ТОРТЫ и НЕ ЛЮБИМЫЕ ТОРТЫ на консоли, поэтому я ожидал бы такого результата:

FAVORITE CAKES: 'chocolate'
FAVORITE CAKES: 'strawberry'
NOT FAVORITE CAKES: 'mint'

Но это не работает должным образом, как вы можете видеть из фрагмента ниже. Что я делаю не так? Я ценю любую помощь.

const cakes = [
    {id: 1, name: 'chocolate'},
    {id: 2, name: 'strawberry'},
    {id: 3, name: 'mint'}
]

// favorite cakes for logged in user
const favCakes = [
    {id: 1, cakeId: 1},
    {id: 2, cakeId: 2}
]

for (const cake of cakes) {
    for (const fav of favCakes) {
        if (cake.id === fav.cakeId) {
            console.log('FAVORITE CAKE: ', cake.name )
        }
        else if (cake.id !== fav.cakeId) {
            console.log('NOT FAVORITE CAKE: ', cake.name )
        }
    }
}

Ответы [ 5 ]

3 голосов
/ 08 мая 2020

Вы можете использовать forEach и find. Используйте forEach для перебора массива cakes и используйте его идентификатор, чтобы найти объект с таким же id в favCakes. Если id совпадает, зарегистрируйте имя с избранным, иначе с не избранным

const cakes = [{
    id: 1,
    name: 'chocolate'
  },
  {
    id: 2,
    name: 'strawberry'
  },
  {
    id: 3,
    name: 'mint'
  }
]

const favCakes = [{
    id: 1,
    cakeId: 1
  },
  {
    id: 2,
    cakeId: 2
  }
]

cakes.forEach((item) => {
  const isFav = favCakes.find(elem => elem.id === item.id)
  if (isFav) {
    console.log('Fav cake ', item.name)
  } else {
    console.log('Not Fav cake ', item.name)
  }

})
3 голосов
/ 08 мая 2020

Вы слишком рано проверяете не избранные. Вы можете определить не избранные только после того, как просмотрели все избранное:

for (const cake of cakes) {
    let isFavorite = false; // assume

    for (const fav of favCakes) {
        if (cake.id === fav.cakeId) {
            console.log('FAVORITE CAKE: ', cake.name)
            isFavorite = true;
            break;
        }
    }

    if ( ! isFavorite ) {
        console.log( 'NOT FAVORITE CAKE: ', cake.name )
    }

}
2 голосов
/ 08 мая 2020

Вам нужно следить за тем, попал ли торт в ваш список избранного. Затем, просмотрев все избранное, вы можете сообщить, было ли оно найдено.

const cakes = [
    {id: 1, name: 'chocolate'},
    {id: 2, name: 'strawberry'},
    {id: 3, name: 'mint'}
]

// favorite cakes for logged in user
const favCakes = [
    {id: 1, cakeId: 1},
    {id: 2, cakeId: 2}
]

for (const cake of cakes) {
    let foundAsFavorite = false
    
    for (const fav of favCakes) {
        if (cake.id === fav.cakeId) {
            foundAsFavorite = true
        }
    }

    if (foundAsFavorite) {
        console.log('FAVORITE CAKE: ', cake.name )
    }
    else {
        console.log('NOT FAVORITE CAKE: ', cake.name )
    }
}

Вот более простое решение, которое использует функцию Array.some, чтобы узнать, подходят ли какие-нибудь избранные вашему торту:

const cakes = [
    {id: 1, name: 'chocolate'},
    {id: 2, name: 'strawberry'},
    {id: 3, name: 'mint'}
]

// favorite cakes for logged in user
const favCakes = [
    {id: 1, cakeId: 1},
    {id: 2, cakeId: 2}
]

for (const cake of cakes) {
    const foundAsFavorite = favCakes.some(fav => cake.id === fav.cakeId)

    if (foundAsFavorite) {
        console.log('FAVORITE CAKE: ', cake.name )
    }
    else {
        console.log('NOT FAVORITE CAKE: ', cake.name )
    }
}
1 голос
/ 08 мая 2020

Вы не должны делать это вложенным - вместо этого используйте такой метод, как some внутри forEach, и упростите его с деструктуризацией:

const cakes = [
    {id: 1, name: 'chocolate'},
    {id: 2, name: 'strawberry'},
    {id: 3, name: 'mint'}
]

// favorite cakes for logged in user
const favCakes = [
    {id: 1, cakeId: 1},
    {id: 2, cakeId: 2}
]

cakes.forEach(({ id, name }) => {
    if (!favCakes.some(({ cakeId }) => cakeId == id)) {
      console.log("NOT FAVOURITE CAKE: " + name);
    } else {
      console.log("FAVOURITE CAKE: " + name);
    }
});
0 голосов
/ 08 мая 2020

вы можете создать такой список подстановки.

    const cakes = [{
        id: 1,
        name: 'chocolate'
      },
      {
        id: 2,
        name: 'strawberry'
      },
      {
        id: 3,
        name: 'mint'
      }
    ];

    // favorite cakes for logged in user
    const favCakes = [{
        id: 1,
        cakeId: 1
      },
      {
        id: 2,
        cakeId: 2
      }
    ];

    const favCakeIds = favCakes.map(c => c.cakeId);

    for (const cake of cakes) {
      if (favCakeIds.includes(cake.id)) {
        console.log('FAVORITE CAKE: ' + cake.name)
      } else {
        console.log('NOT FAVORITE CAKE: ' + cake.name)
      }
    }

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