首页 > 解决方案 > 有什么方法可以区分js中的数组键类型?arr[1] !== 比 arr["1"]

问题描述

我试图解决数组问题中最受欢迎的项目。

我发现了一些使用地图的 O(n) 解决方案,但是当你有混合数据类型时,没有什么能很好地工作,比方说

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

“1”get 与 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;
}

标签: javascriptarrayscomparison

解决方案


一些使用地图的 O(n) 解决方案

Maps 工作得很好,因为映射“键”可以是任何类型,包括数字、字符串和对象(它们是有区别的):

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)


推荐阅读