Z jakiegoś powodu nie byłem w stanie zrozumieć, co się dzieje w tym kodzie

function mode(arr){
  var modecount = {}; // creating an object to add number and its mode
  for(var i = 0; i < arr.length; i++){ //iterating through array
    if(!modecount[arr[i]]){ /*This part I don't understand what do these two lines mean?
    I interpret it as if the current number in the array doesn't equal a number already
    in the modecount object then it equals 0 */
      modecount[arr[i]] = 0;
    }
    modecount[arr[i]] += 1; /* also what is happening here it is adding 1 to the value
    of modecount but why does it not add 1 to unique numbers and how does the code know
    to add 1 if it finds duplicates? */
    }
  return modecount;
}
mode([3,4,3,43,4,34,34,3,3,3,3,3]);

Wygląda na to, że wpatrywałem się w ten kod przez kilka godzin i po prostu nie mogę go zdobyć. Ktoś proszę mi to wyjaśnić, jakbym miał 3 lata.

1
user2755667 3 grudzień 2013, 04:07

4 odpowiedzi

Zasadniczo zliczanie liczby określonej wartości w minimalnej tablicy istnieje, ale z wartością podstawową 0, aby uzyskać pierwsze występowanie wartości, aby zainicjować właściwość w tej wartości.

Mimo że modecount jest określony jako obiekt, sposób, w jaki można uzyskać dostęp do właściwości obiektu w zmiennym sposobie, jest przy użyciu notacji wspornika. Więc wyjście

mode([3,4,3,43,4,34,34,3,3,3,3,3]);

Byłoby:

{ 3: 7, 4: 2, 43: 1, 34: 2 } 
1
Mike Brant 3 grudzień 2013, 00:13

Mam nadzieję, że to pomoże. Przełączałem kilka zmiennych, ponieważ czułem, że czytał trochę ładniej.

function mode(arr){

  // create an index for our counter
  var index = {};

  // a normal for-loop to iterate through the passed in numbers
  for(var i=0, num; i<arr.length; i++){

    // each time the foor loop runs, set num to arr[i]
    num = arr[i];

    // if no valid counter was found...
    if(!index[num]){

      // then create a new counter; initialize to 0
      index[num] = 0;
    }

    // add 1 to the counter
    index[num] += 1;
  }

  // return the counters
  return index;
}

mode([3,4,3,43,4,34,34,3,3,3,3,3]);
1
maček 3 grudzień 2013, 00:16

Zakładam, że pierwsza część jest po prostu skrótem, aby sprawdzić, czy modecount[arr[i]] został jeszcze zainicjowany / zdefiniowany. Jeśli zwróci "fałszywą" wartość, albo nie jest zainicjowany (dostęp {X1}} zwraca undefined) lub ma wartość 0 - Ten ostatni nie jest możliwy, ponieważ następny linia zawsze Natychmiast przyniesie 0 do 1.

Uwaga Możesz zastąpić to sprawdzenie za pomocą if(typeof(modecount[arr[i]]) === "undefined") dla równoważnego i bardziej jawnego zachowania.

Jeśli chodzi o ogólną obsługę funkcji, należy rozważyć następujący pseudokod:

var modecount = {}

foreach element in array:
    if modecount[element.value] is not defined:
        modecount[element.value] = 0

    modecount[element.value]++
1
lc. 3 grudzień 2013, 00:19

Pętle funkcji przez minącej tablicy, przechowywanie każdego numeru padającego jako numer: Policz Para na obiekcie Modecount. Tak jak działa twoja funkcja, obiekt MODECOUNT będzie tak wyglądać:

{}
{ 3: 1 }
{ 3: 1, 4: 1 }
{ 3: 2, 4: 1 }
{ 3: 2, 4: 1, 43: 1 }
{ 3: 2, 4: 2, 43: 1 }
and so on...
0
sbking 3 grudzień 2013, 00:14