как я могу сделать это лучше в javascript: добавить пару (ключ, значение) к ha sh во время итерации? - PullRequest
0 голосов
/ 12 июля 2020

Я написал это решение, которое работает, хотя я хотел бы проверить с сообществом, есть ли лучший способ добавить пару (ключ, значение) в ha sh, пока я повторяю . Мне нужно создать новую функцию с именем addPairToHashAndReturnIt в качестве вспомогательной функции.

Задача заключается в следующем:

Создайте функцию countBy, которая принимает массив и обратный вызов и возвращает объект. countBy будет перебирать массив и выполнять обратный вызов для каждого элемента. Каждое возвращаемое значение из обратного вызова будет сохранено как ключ объекта. Значением, связанным с каждым ключом, будет количество возвращаемых возвращаемых значений.

function countBy(array, callback) {
  return array.reduce(
    (acc, each) =>
      (!acc[callback(each)] && addPairToHashAndReturnIt(acc, callback(each), each)) ||
      ((acc[callback(each)] += 1) && acc),
    {}
  );
}
    
const addPairToHashAndReturnIt = (hash, key, value) => {
  hash[key] = 1;
  return hash;
};
    
function evenOrOddNumber(num) {
  if (num % 2 === 0) return 'even';
  else return 'odd';
};

console.log(
  countBy([1, 2, 3, 4, 5], evenOrOddNumber)
); // should log: { odd: 3, even: 2 }

Итак, что вы думаете об этом решении?

1 Ответ

1 голос
/ 12 июля 2020

Упростите лог c, не усложняйте его излишне.

Мы не хотим перезаписывать значение hash[value] на 5 (например, ), мы просто хотим увеличивать hash[value] каждый раз, когда мы получаем совпадение. Форма будет выглядеть как hash[value]++, а не hash[value] = item.

См. Также: Является ли Reduce () плохим?

const evenOrOddNumber = (num) => (num % 2 == 0)
  ? 'even'
  : 'odd';

const countBy = (array, callback) => {
  // store counts
  const counts = {};
  
  array.forEach(item => {
    // store callback result, previous count
    const val = callback(item);
    const prevCount = counts[val] || 0;
    
    // increment count
    counts[val] = prevCount + 1;
  });
  
  return counts;
}

console.log(
  countBy([1, 2, 3, 4, 5], evenOrOddNumber)
); // should log: { odd: 3, even: 2 }
...