Использование Reduce для удаления четных чисел в объекте. - PullRequest
1 голос
/ 31 мая 2019

Мне дан массив чисел.Я создал объект с именем count, ключами которого являются числа, а значения - количество раз, которое эти числа появляются в массиве.Не могу понять, как использовать уменьшение, чтобы удалить четные числа чисел.

A =  [ 20, 1, -1, 2, -2, 3, 3, 5, 5, 1, 2, 4, 20, 4, -1, -2, 5 ]

n =  5

function findOdd(A) {

  let counts = {};

  for (let i = 0; i < A.length; i++) {
    let num = A[i];
    counts[num] = counts[num] ? counts[num] + 1 : 1;
  }

//counts -> { '1': 2, '2': 2, '3': 2, '4': 2, '5': 3, '20': 2, '-1': 2, '-2': 2 }

  const answer = Object.keys(counts).reduce((object, key) => {
    if (key % 2 !== 0) {
      object[key] = counts[key];
    }
    return object;
  }, {})

  return answer;

Необходимо вернуть ключ нечетного числа.

РЕШЕНИЕ:

function findOdd(A) {
  const counts = {};
  for (let i = 0; i < A.length; i++) {
    let num = A[i];
    counts[num] = counts[num] ? counts[num] + 1 : 1;
  }
  Object.keys(counts).forEach(key => {
    if(counts[key] % 2 === 0) {
    delete counts[key];
    }
  });
  return Number(Object.keys(counts));
}

Ответы [ 3 ]

1 голос
/ 31 мая 2019

Вы можете использовать Object.entries для получения значений, затем filter записей, значения которых нечетны, и затем восстановить новый объект из этих записей, используя Object.fromEntries:

const countObject = { '1': 2, '2': 2, '3': 2, '4': 2, '5': 3, '20': 2, '-1': 2, '-2': 2 };
const oddEntries = Object.entries(countObject).filter(([key, value]) => value % 2 !== 0);
const oddCountObject = Object.fromEntries(oddEntries)

console.log(oddCountObject)
0 голосов
/ 31 мая 2019

Я знаю, что уже есть отличные ответы, но, поскольку вопрос сказал "используй уменьшение", я подумал, что было бы интересно попробовать сделать это, используя только reduce:

const findOdd = arr => arr.reduce((acc, d, i, list) => {
    if (!acc[d]) {
        acc[d] = 0;
    }

    acc[d]++;

    if (i === list.length - 1) {
        return Object.keys(acc)
            .reduce((subAcc, key) => ({
                ...subAcc,
                ...(acc[key] % 2 === 0 ? {} : {
                    [key]: acc[key]
                })
            }), {})
    }
    return acc;
}, {})
0 голосов
/ 31 мая 2019

function findOdd(arr) {
  const counts = {}; // `const` declared objects/arrays are not immutable
  for(let i = 0; i < arr.length; i++) {
    counts[arr[i]] = counts[arr[i]] || 0;
    counts[arr[i]]++;
  }
  Object.keys(counts).forEach(key => {
    if(counts[key] % 2 === 0) {
      delete counts[key];
    }
  });
  return counts;
}

const array = [1, 2, 3, 4, 5, 6, 1, 1, 4, 5, 4, 9];
// 1:3, 2:1, 3:1, 4:3, 6:1, 9:1
// Does not show a `5` key due to there being an even number of fives in `array`

console.log(findOdd(array));

Да, я знаю, delete неэффективно, но это не должно иметь значения, если только это не является требованием к быстроте.Я считаю, что вы можете просто установить counts[key] = undefined или counts[key] = null, вы можете увидеть тесты здесь

...