Создать карту частот с помощью карты - JavaScript - PullRequest
0 голосов
/ 26 июня 2019

Попытка решить эту проблему Codwars Kata .

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

Примеры:

[1, 2, 4, 4, 3, 3, 1, 5, 3, '5']  ==>  [4, 3, 1]
[0, 1, 2, 3, 4, 5]                ==>  []

У меня есть:

function duplicates(arr) {

  arr.sort((value, index) => value - index);
  let duplicates = [];
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] === arr[i + 1]) {
      duplicates.unshift(arr[i]);
    }
  }
  //filter out duplicates within "duplicates"
  duplicates = duplicates.filter((value, index) =>
     duplicates.indexOf(value) == index);
  return duplicates;
}

console.log(duplicates([1, 2, 4, 4, 3, 1, 5, '5'])); 

Это проходит все тесты, кроме одного:

Ожидается: '[1, 4]', вместо этого получено: '[4,1] '

И я не уверен, почему - к сожалению, он не отображает контрольный пример.

Было предложено, однако, еще один способ создать карту частот с помощью Map .Как бы я это сделал?

Я пытался:

function duplicates(arr) {

  let map = new Map([arr]);
  return map;

}

console.log(duplicates([1, 2, 4, 4, 3, 1, 5, '5'])); 

, и это не создает частотную карту.

Какие еще предложения вы бы предложили?

ПРИМЕЧАНИЕ - "5" и 5 не должны учитываться как одно и то же значение.

РЕДАКТИРОВАТЬ - Первоначально пытался создать частотную карту следующим образом:

function duplicates(arr) {
  let map = {};
  arr.forEach((value, index) => {
    if (!map[value]) {
      map[value] = 0;
    }
    map[value] += 1;
  })
  return map;
}

console.log(duplicates([1, 2, 4, 4, 3, 1, 5, '5'])); 

Но в этом случае "5" и 5 считаются одним и тем же значением,Я не знаю, как еще проверить наличие дубликатов - сортировка нарушает порядок появления дубликатов;и создание подсчета частот и чисел числа и строки как одно и то же.

Ответы [ 2 ]

2 голосов
/ 26 июня 2019

Вот идея, которая должна работать:

Создать Карта (ключи карты различают тип, поэтому 5 - это ключ, отличный от "5")

Используйте фильтр, чтобы просмотреть элементы в вашем массиве. По мере прохождения подсчитывайте, сколько раз вы видели элемент на своей карте. Возвращайте true из фильтра только тогда, когда счетчик (до того как вы его увеличили) равен 1. Это второй раз, когда вы видели этот предмет.

Фильтр должен вернуть ваш ответ:

function duplicates(arr) {
   let counts = new Map()
   return arr.filter(n => {
        let count = counts.get(n)
        counts.set(n, count ? count+1 : 1)
        return count === 1     
   })
}

console.log(duplicates([1, 2, 4, 4, 3, 1, 5, '5'])); 
1 голос
/ 26 июня 2019

Возможно, это не самое эффективное решение, но оно решает проблему. Обратите внимание, я использую js object для имитации карты

 function duplicates(arr) {
  // TODO: return the array of duplicates from arr
  const map = {};
  const dup = {};

  for (const val of arr) {
    let key = val;
    if (typeof val === 'string') {
      key = `${val}_str`;
    }

    if (map[key]) {
      dup[val] = true;
    } else {
      map[key] = true;
    }
  }
  return Object.keys(dup)
  .map( d => (!Number.isInteger(parseInt(d))) ? d : Number(d));
}

console.log(duplicates([1, 2, 4, 4, 3, 1, 5, '5'])); 
...