Любой способ дифференцировать типы ключей массива в JS?arr [1]! == than arr ["1"] - PullRequest
0 голосов
/ 24 июня 2018

Я пытался решить самый популярный элемент в проблеме с массивами.

Я нашел несколько решений O (n) с использованием карт, но ничего, что вполне работало, когда у вас смешанные типы данных, скажем,

[1,2,1,3,"1","a"]

"1" получает смешанный с 1. Есть ли шанс, что я могу отменить сравнение в JS?Или любое решение O (n), которое могло бы это исправить?

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

function getMostFrequent(array) {

    if (array.length == 0)
        return null;

    let mapEl = {};
    let maxEl = [];
    let maxCount = 1;

    for (let i = 0; i < array.length; i++) {
        let el = array[i];

        if (mapEl[el] == null) {
            mapEl[el] = 1;
        } else {
            mapEl[el]++;
        }

        if (mapEl[el] > maxCount) {
            maxCount = mapEl[el];
            maxEl = [el];
        } else if (mapEl[el] === maxCount) {
            maxEl.push(el);
        }

    }

    console.log(maxEl);
    return maxEl;
}

1 Ответ

0 голосов
/ 24 июня 2018

некоторые O (n) решения с использованием карт

Map s работают просто отлично, потому что «ключи» карты могут быть любого типа, включая числа, строки и объекты (которые различаются ):

const input = [1,2,1,3,"1", "1", "1", "a"];
const map = new Map();
input.forEach(key => map.set(key, (map.get(key) || 0) + 1));
console.log(
  [...map.entries()].reduce((a, b) => b[1] > a[1] ? b : a)
);

Можно также использовать reduce, что немного больше подходит для этой ситуации:

const input = [1,2,1,3,"1", "1", "1", "a"];
const map = input.reduce(
  (map, key) => map.set(key, (map.get(key) || 0) + 1),
  new Map()
);
console.log(
  [...map.entries()].reduce((a, b) => b[1] > a[1] ? b : a)
);

Да, это O(N).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...