如何在数组中找到具有最多值的对象的值(深度模式)

  • 本文关键字:对象 模式 深度 数组 javascript
  • 更新时间 :
  • 英文 :


假设我有一个包含以下对象的数组:

const persons = [
{
name: "Erik",
age: 45
},
{
name: "Bob",
age: 37
},
{
name: "Erik",
age: 28
},
{
name: "Jasper",
age: 29
},
{
name: "Erik",
age: 34
}
]; 

如何根据值出现次数最多的键查找值?在本例中,当传递name作为密钥时,它将是Erik

类似这样的东西:

const deepMode = (array, key) => {
// Perhaps something with .reduce?
}

当被调用时,它应该返回:

deepMode(persons, "name"); // Returns "Erik"

您可以使用Map,计算ocurrence并减少键/值对以获得最大值。返回密钥,无需再次迭代。

const
deepMode = (array, key) => Array
.from(array.reduce((m, o) => m.set(o[key], (m.get(o[key]) || 0) + 1), new Map))
.reduce((a, b) => a[1] > b[1] ? a : b)[0],
persons = [{ name: "Erik", age: 45 }, { name: "Bob", age: 37 }, { name: "Erik", age: 28 }, { name: "Jasper", age: 29 }, { name: "Erik", age: 34 }]; 
console.log(deepMode(persons, 'name'));

您可以通过将键添加到对象中并检查键是否存在于对象中来计数键,然后增加值,如果不存在,则将键添加至对象中,然后使用Object.keys获取对象的键对其进行排序并获取最常出现的的第一个元素

const persons = [
{
name: "Erik",
age: 45
},
{
name: "Bob",
age: 37
},
{
name: "Erik",
age: 28
},
{
name: "Jasper",
age: 29
},
{
name: "Erik",
age: 34
}
];
const deepMode = (array, key) => {
const obj = {};
array.forEach(v => {
if (obj[v[key]]) {
obj[v[key]] += 1;
} else {
obj[v[key]] = 1;
}
});

return Object.keys(obj).sort((a,b) => obj[b]-obj[a])[0];
}
console.log(deepMode(persons, 'name'));

您可以简化为Map,找到最大值,然后找到并返回它。

function findMostOccuringKeyValue(arr, key) {
const grouped = arr.reduce((a, b) => a.set(b[key], (a.get(b[key]) || 0) + 1), new Map);
const max = Math.max(...grouped.values());
return [...grouped].find(([k, v]) => v === max)[0];
}
console.log(findMostOccuringKeyValue(persons, 'name'));
<script>
const persons = [
{
name: "Erik",
age: 45
},
{
name: "Bob",
age: 37
},
{
name: "Erik",
age: 28
},
{
name: "Jasper",
age: 29
},
{
name: "Erik",
age: 34
}
];
</script>

最新更新