Mam problem. Próbuję zamienić każde wystąpienie mojego stanu subscribed wewnątrz mojej tablicy obiektów na mój stan pending.

Najpierw wypróbowałem to z .find(), ale zmieniło to tylko pierwszy element. Zrobiłem więc trochę badań nad SO i odkryłem, że .find() zatrzymuje się po pierwszym wystąpieniu. Rozwiązaniem tego pytania było .filter(), ale jakoś nadal nie działa:

let subscribedChannels = [];

subscribedChannels.push( {
	name: "ABC",
	status: "subscribed"
} );

subscribedChannels.push( {
	name: "DEF",
	status: "subscribed"
} );

subscribedChannels.push( {
	name: "GHI",
	status: "subscribed"
} );

console.log(subscribedChannels);

subscribedChannels.find( channel => channel.status === "subscribed" ).status = "pending"; //Not working because stopping after first element

console.log(subscribedChannels);

subscribedChannels.filter( channel => channel.status === "subscribed" ).status = "pending"; //Also not working but don't know why

console.log(subscribedChannels);
1
Mr. Jo 2 kwiecień 2020, 11:26

3 odpowiedzi

Najlepsza odpowiedź

Chcesz uzyskać dostęp do each, więc użyj forEach

Nie sądzę, aby filter i map brzmiały poprawnie semantycznie, mimo że działałyby - pierwszy to zwrócenie podzbioru, a drugi to zwrócenie nowej tablicy

const subscribedChannels = [
  { name: "ABC", status: "subscribed"},
  { name: "DEF", status: "done"},
  { name: "GHI", status: "subscribed"}
];
console.log(JSON.stringify(subscribedChannels));


subscribedChannels.forEach(channel => {
  if (channel.status === "subscribed") channel.status = "pending"
});

// without the brackets
// subscribedChannels.forEach(c => c.status = c.status === "subscribed" ? "pending" : c.status);

console.log(JSON.stringify(subscribedChannels));

WSKAZÓWKA jeśli potrzebujesz ŁAŃCUCHA tablicy i na przykład filtrowania po zmianie, powinieneś użyć mapy

const subscribedChannels = [
  { name: "ABC", status: "subscribed"},
  { name: "DEF", status: "done"},
  { name: "GHI", status: "subscribed"}
];


console.log(JSON.stringify(subscribedChannels));

const done = subscribedChannels
  .map(c => { c.status = c.status === "subscribed" ? "pending" : c.status; return c; }) // not the return c
  .filter(c => c.status === "done")

console.log(JSON.stringify(subscribedChannels));
console.log(JSON.stringify(done));
3
mplungjan 2 kwiecień 2020, 08:59

Możesz uruchomić coś takiego:

const subscribedChannels = [
  { name: "ABC", status: "subscribed"},
  { name: "DEF", status: "done"},
  { name: "GHI", status: "subscribed"}
];

console.log(subscribedChannels.map(c => {
      c.status = c.status == "subscribed" ?
        "pending" :
        c.status; return c;
    }).filter(c => c.status=="done")
)    
2
Onilol 6 kwiecień 2020, 10:00

Dlaczego nie użyjesz zamiast tego mapy:

const pendingChannels = subscribedChannels.map(channel => {
  if(channel.status === "subscribed") {
    channel.status = "pending"
  }

  return channel
})
1
Gh05d 2 kwiecień 2020, 08:30