Найти ключ объекта по его значению?

Решаю замечательную задачу на перебор массивов и объектов.Столкнулся с проблемой, при использовании разных вариантов нахождения ключа по его значению в объекте выдаёт undefined.Не могу понять в чём дело.
Код ниже:
function findOdd(A) {
  let result = {};
  A.forEach(function(item){
    if (result[item] != undefined)
        ++result[item];
    else
        result[item] = 1;
  });
  if (Object.keys(result).length<2) { // по условию задачи, если значение единственное, то возвращаем его.
    return(Object.keys(result));
  } else {
    res = Object.values(result).filter((item)=>item%2 !==0); //
    function getKeyByValue(object, value) {
      Key = Object.keys(object).find(key => object[key] === value);
      return Key;
    }
    console.log(result); //для наглядности вывести obj
    console.log(getKeyByValue(result, res)); 
  }
}

Arr = [1,2,2,3,3,3,4,3,3,3,2,2,1];
findOdd(Arr);

Так же сам текст задачи:
Given an array of integers, find the one that appears an odd number of times.

There will always be only one integer that appears an odd number of times.

Examples
[7] should return 7, because it occurs 1 time (which is odd).
[0] should return 0, because it occurs 1 time (which is odd).
[1,1,2] should return 2, because it occurs 1 time (which is odd).
[0,1,0,1,0] should return 0, because it occurs 3 times (which is odd).
[1,2,2,3,3,3,4,3,3,3,2,2,1] should return 4, because it appears 1 time (which is odd).
По хорошему всё должно работать, если функция будет возвращать исправно ключ.Видимо, где-то ошибка.
  • Вопрос задан
  • 1010 просмотров
Решения вопроса 1
XanXanXan
@XanXanXan
function getKeyByValue(object, value) {
Эта функция нигде не используется (консольлог не в счёт). Ну и функции нежелательно объявлять внутри условных конструкций.

findOdd(A) ничего не возвращает в случае else.

spoiler
res = Object.values(result).filter((item)=>item%2 !==0);
А здесь пропало ключевое слово объявления переменной. И res тоже не используется.

Вообще такие задачи решаются в один проход по массиву.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Alexandroppolus
@Alexandroppolus
кодир
это же знаменитая задачка на xor

const findOdd = (a) => a.reduce((r, item) => r ^ item);


У неё ещё есть вариант с двумя числами, встречающимися нечетное количество раз.
Так же, что любопытно, с помощью бинарных массивов (ArrayBuffer и его друзья) это решение можно применить для вещественных чисел.
Ответ написан
Комментировать
@oprk21fjin3 Автор вопроса
Может кому пригодится.
Подправил костыль.Mного лишнего, конечно, но для наглядности сойдёт.
function findOdd(A) {
  let result = {};
  A.forEach(function(item){
    if (result[item] != undefined)
        ++result[item];
    else
        result[item] = 1;
  });
  if (Object.keys(result).length<2) {
    return res = +Object.keys(result);
  } else {
    res = Object.values(result).filter((item)=>item%2 !==0); 
    (function(object, value) {
    Key = Object.keys(result).find(key => result[key] === this.res[0]);
  })();
  return +Key; 
  }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы