• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Liczenie wystąpień wartości w tabeli

0 głosów
282 wizyt
pytanie zadane 20 października 2019 w JavaScript przez smokolisz Mądrala (6,340 p.)

Cześć, mam taki kod z stacka:

function f(a1, a2) {
    let arr = [];
    for(let i = 0; i < a1.length; i++) {
      let count = 0;
      for(let z = 0; z < a2.length; z++) {
        if (a2[z] === a1[i]) count++;
      }
      arr.push({id:a1[i], q:count, u:"+"});
      //console.log(a1[i] + ' count is ' + count) 
    }
    return arr;
}

Dodałem to arr.push. w tablicy arr chce przechowywać dane w taki sposób
{liczba: 0, ile_powtorzen:3}

W tym momencie użycie funkcji z takimi danymi:
[0,0,0,1,0,0,0]
zwraca
0: {id: 0, q: 6, u: "+"}
1: {id: 0, q: 6, u: "+"}
2: {id: 1, q: 1, u: "+"}
3: {id: 0, q: 6, u: "+"}
4: {id: 0, q: 6, u: "+"}
5: {id: 0, q: 6, u: "+"}
6: {id: 0, q: 6, u: "+"}

zamiast
0: {id: 0, q: 6, u: "+"}
1: {id: 1, q: 1, u: "+"}

Wiem czemu tak się dzieje, ale nie umiem poprawić tej funkcji. Może ktoś pomóc?

1
komentarz 20 października 2019 przez ScriptyChris Mędrzec (190,190 p.)

Funkcja przyjmuje dwa argumenty: a1 i a2. Ty podałeś jeden parametr: [0,0,0,1,0,0,0], czym jest drugi?

Na pierwszy rzut oka brakuje jakiegoś if sprawdzającego, czy obiekt ze statystyką dla konkretnego id już jest w wynikowej tablicy.

komentarz 20 października 2019 przez smokolisz Mądrala (6,340 p.)
Podaje dwa razy te same dane
f([0,0,0,1,0,0,0], [0,0,0,1,0,0,0]);

Chodzi o to, żeby ta funkcja mi wypisała powtórzenia z tej tablicy

Pierwszy argument to liczby, które chce szukać, a drugi to tablica, która ma zostać przeszukana
komentarz 20 października 2019 przez smokolisz Mądrala (6,340 p.)
komentarz 20 października 2019 przez smokolisz Mądrala (6,340 p.)

Okej, przerobiłem inną funkcję z tego wątku i teraz działa
 

function foo(arr) {
    var newArr = [];
    var a = [], b = [], prev;
    
    arr.sort();
    for (let i=0;i<arr.length;i++) {
        if ( arr[i] !== prev ) {
            a.push(arr[i]);
            b.push(1);
        } else {
            b[b.length-1]++;
        }
        prev = arr[i];
    }

    for(let i=0;i<a.length;i++) {
        newArr.push({
            id: a[i],
            q: b[i],
            u: "+"
        });
    }
    
    return newArr;
}

Z pewnością dałoby się to lepiej napisać, ale niestety nie mam już chęci z tym walczyć, a jest to raczej mało znaczący fragment aplikacji

1 odpowiedź

+1 głos
odpowiedź 20 października 2019 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 20 października 2019 przez smokolisz
 
Najlepsza
var getObjectIndex = function (output, input, i) {
    return output.findIndex((obj) => obj.id === input[i]);
}

function f(a1, a2) {
    let arr = [];
    for(let i = 0; i < a1.length; i++) {
      let count = 0;
      for(let z = 0; z < a2.length; z++) {
        if (a2[z] === a1[i]) count++;
      }
      
      var stat = {id:a1[i], q:count, u:"+"};

      if (getObjectIndex(arr, a1, i) === -1) {
		arr.push(stat);
      } else {
		arr[getObjectIndex(arr, a1, i)].q = count
      }
    }

    return arr;
}

Przed wrzuceniem nowego obiektu do tablicy powinieneś sprawdzić, czy znajduje się już tam obiekt z konkretnym id i w takim przypadku tylko zaktualizować property q. W przeciwnym razie dodajesz cały obiekt do tablicy.

komentarz 20 października 2019 przez smokolisz Mądrala (6,340 p.)
Dzięki działa :)

Podobne pytania

0 głosów
1 odpowiedź 1,354 wizyt
0 głosów
0 odpowiedzi 627 wizyt
pytanie zadane 27 maja 2019 w Java przez manager96 Bywalec (2,050 p.)
0 głosów
0 odpowiedzi 456 wizyt
pytanie zadane 23 maja 2019 w Java przez manager96 Bywalec (2,050 p.)

93,424 zapytań

142,421 odpowiedzi

322,646 komentarzy

62,785 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...