javascript - 有什么方法可以区分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;
}
解决方案
一些使用地图的 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)
。
推荐阅读
- kofax - 唯一的 KTA 作业名称
- javascript - How to import typescript file into script tag
- android - Is it possible to convert android/iOS app in cross platform app?
- r - R Shiny - create internal link to another element of my app
- asp.net-core - How I can Use IUserIdPriver? where am I doing wrong?
- angular - Angular 中的单元测试无法读取 null 的“setValidators”
- windows - problem with service interpretation in windows powershell script
- python - Module 'cv2.cv2' has no attribute 'COLOR'
- python-3.x - Python3 textcoding issue: extra first character when reading from text file using for loop
- node.js - 解析函数和泛型类型保护