JavaScript Подсчет нескольких элементов массива - PullRequest
2 голосов
/ 05 января 2020

Передо мной была поставлена ​​задача подсчета, в которой я должен вернуть объект, содержащий количество элементов в массиве. например,

expect(createTally(['a', 'b', 'a'])).to.eql({ a: 2, b: 1 });

Итак, мне удалось сделать это с помощью функции уменьшения высшего порядка, но я хочу быть в состоянии сделать это с помощью для l oop, поэтому я действительно могу увидеть, как это работает, мой код для метода уменьшения ниже ...

const createTally = items => {
  const counter = items.reduce((acc, curr) => {
    acc[curr] = (acc[curr] || 0) + 1
    return acc
  }, {})
  return counter
}

Пока для моего для l oop у меня есть ...

const createTally = items => {
  const tally = {};
  let count = 0

  if (items.length > 0) {
    for (let i = 0; i < items.length; i++) {
      if (items[i].length > count) {
        count += count + 1
        console.log(count)
      }

      const key = items[i]
      tally[key] = count
      return tally
    }

  } else {
    return tally;
  }
}

Я изо всех сил пытаюсь увеличить мой счет и без прохождения каких-либо тестов, кроме возможности возврата пустого объекта при передаче пустого массива и прохождения 1 пары ключ-значение при задании одного элемента, любая помощь будет принята с благодарностью, спасибо

Ответы [ 3 ]

1 голос
/ 05 января 2020

Вы создали мои ненужные циклы и условия. Вам просто нужен один l oop и условие if.

Выполните команду al oop. Проверьте, находится ли объект уже внутри объекта. Если оно есть, увеличьте его на единицу. В противном случае присвойте его 0, и тогда оно будет увеличено на 1.

Вам также не нужно проверять длину массива в начале. Подумайте, если length равно 0, то для l oop не будет повторяться ни разу, а tally будет пустым объектом, возвращаемым в конце.

const createTally = items => {
   const tally = {};
   for (let i = 0; i < items.length; i++) {
      if (!tally[items[i]]) {
         tally[items[i]] = 0;
      }
      tally[items[i]]++;
   }
   return tally
}


console.log(createTally(['a', 'b', 'a']))
1 голос
/ 05 января 2020

Гораздо более простое решение даст что-то вроде следующего без циклов for:

const createTally = (items = []) => {  
  const tally = {}

  items.forEach(key => {
    tally[key] = tally[key] ? tally[key] + 1 : 1
  })

  return tally
}

console.log(createTally(['a', 'b', 'a']))
1 голос
/ 05 января 2020

Я не совсем уверен, почему вы проверяете .length элемента в вашей реализации for-l oop. Главное, что вам нужно сделать, это перебрать массив элементов, используя for l oop. Затем проверьте, находится ли текущий элемент в вашем tally объекте. Если это уже так, вы можете увеличить значение соответствующего счетчика, если это не так, вы можете инициализировать значение соответствующего счетчика равным 1.

. for l oop не будет повторяться, если длина вашего массива изначально равен 0 (ie: пусто), поэтому ваш код по умолчанию вернет пустой объект, если это так.

См. пример ниже (см. комментарии к коду для получения дополнительной информации):

const createTally = items => {
  const tally = {}; // acts as the `acc`

  for (let i = 0; i < items.length; i++) { // loop over indexes in your array
    let current = items[i]; // get current item in your array (curr)
    
    // if statement peforms this logic seen in `.reduce()`: acc[curr] = (acc[curr] || 0) + 1
    if(tally[current]) // if the current item is already a key in your object then...
      tally[current]++ // increment the counter for current item
    else // if the current item isn't an item in your object, then...
      tally[current] = 1; // initialize the counter to 1
  }
  return tally; // return the `tally` (modified by the for loop)
}

console.log(createTally(['a', 'b', 'a'])); // {"a": 2, "b": 1}
console.log(createTally([])); // {}
...