有什么方法可以区分js中的数组键类型? arr [1]!==比arr [“ 1”]

时间:2018-06-24 00:17:58

标签: javascript arrays comparison

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

我发现一些使用映射的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 :(得分:2)

  

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

Map可以正常工作,因为地图“键”可以是任何类型,包括数字,字符串和对象( 是有区别的):

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)