Próbuję usunąć duplikaty z danych przekazywanych z węzła. Funkcja pobierania danych to:

getProducts(_) {
     const dev = "http://localhost:3008/api"
      fetch(dev) 
      .then(res => res.json())
      .then(data => {
       /* this.setState
        ({
          data: data.data
        })
      })*/
     this.removeDuplicates(data) 
      })
    }

Moja funkcja usuwania duplikatów to:

removeDuplicates(arr){ 
    let array = arr.data
  console.log(array)
    array.sort((a,b) => {return a.webservice - b.webservice}) 
  let length = array.length 
   for ( var i = 0; 
          i < length; 
          i++ ){
            let x = i+1
           console.log(array[x].webservice)
    /*  if (array[i].webservice == array[x].webservice){
        delete array[i]
      }*/
     // console.log(array)
      }
  }

Kiedy console.log data - zwraca tablicę obiektu zgodnie z oczekiwaniami. Kiedy console.log array[i].webservice - zwraca usługę sieciową Ale kiedy próbuję zrobić to samo dla array[x].webservice (czyli i + 1), zwraca array [x] jest niezdefiniowanym błędem krytycznym, ale nadal console.logsuje dane.

Czy coś mi umyka?

1
Amer 19 grudzień 2019, 21:24
Polecam używanie lodash. Posiada funkcję filtrowania, której szukasz.
 – 
M.Nar
19 grudzień 2019, 21:28
Czy możesz pokazać przykładową zawartość data
 – 
Mario
19 grudzień 2019, 21:35
Zasadą jest, aby nigdy nie mutować zapętlonej tablicy ani nie zmieniać indeksu. Robisz oba tutaj. Funkcja zmniejszania byłaby lepsza, aby odfiltrować unikaty. Dobrym rozwiązaniem jest funkcja array.reduce, którą udostępnia @user615274.
 – 
Jeffrey Devloo
19 grudzień 2019, 22:57

2 odpowiedzi

Przyjrzyj się bliżej tej części kodu:

for (var i = 0; i < length; i++ ){
  let x = i+1;
  // ...etc....
}

Powiedzmy, że długość tablicy wynosi 3. Gdy i = 2, jest mniejsze niż 3, więc pętla zostanie wykonana; x = i + 1 = 2 + 1 = 3. Następnie próbujesz uzyskać dostęp do array[3] - ale tablica o długości 3 ma tylko wartość od 0 do 2! To będzie próba uzyskania dostępu poza granice twojej tablicy, stąd błąd.

3
IceMetalPunk 19 grudzień 2019, 21:35

Możesz usunąć duplikaty z tablicy w następujący sposób:

Zakładając, że Twoje dane są podobne do tego

const data = [
  { webservice: "a" },
  { webservice: "b" },
  { webservice: "c" },
  { webservice: "b" },
  { webservice: "d" },
];

W tym przykładzie element z usługą sieciową o wartości b i indeksie 3 zostanie wykluczony z powtarzania

const data = [
  { webservice: "a" },
  { webservice: "b" },
  { webservice: "c" },
  { webservice: "b" },
  { webservice: "d" },
];

const output = data.reduce((accumulator, current) => {
  if (!accumulator.some(element => element.webservice === current.webservice)) {
    accumulator.push(current);
  }

  return accumulator;
}, []);

console.log(output);

Mam nadzieję, że poprawnie zinterpretowałem Twoje pytanie

0
Mario 19 grudzień 2019, 22:53
Możesz też po prostu zredukować go do obiektu z webservice jako kluczem, dane jako wartość i zwrócić object.values ​​na końcu. Oszczędza wiele pętli
 – 
Jeffrey Devloo
19 grudzień 2019, 22:58
Jeśli używasz ES6/ES2015 lub nowszego, możesz to zrobić w ten sposób: const unique = [...new Set(data.map(item => item.webservice))];
 – 
khizer
29 grudzień 2019, 01:20