我有一个看起来像这样的对象数组:
[ { person: 'Fred', scoreTotal: 29 },
{ person: 'Alice', scoreTotal: 34 },
{ person: 'Alice', scoreTotal: 22 },
{ person: 'Mary', scoreTotal: 14 },
{ person: 'Bob', scoreTotal: 33 },
{ person: 'Bob', scoreTotal: 13 },
{ person: 'Bob', scoreTotal: 22 },
{ person: 'Joe', scoreTotal: 28 }]
并且对于给定的人有多个对象 -> 我想保留顶部的“X”。例如:
一个。一个人的前 1 个结果 结果看起来像这样:
[ { person: 'Fred', scoreTotal: 29 },
{ person: 'Alice', scoreTotal: 34 },
{ person: 'Mary', scoreTotal: 14 },
{ person: 'Bob', scoreTotal: 33 },
{ person: 'Joe', scoreTotal: 28 }]
一个人的前 2 个结果 结果看起来像这样:
[ { person: 'Fred', scoreTotal: 29 },
{ person: 'Alice', scoreTotal: 34 },
{ person: 'Alice', scoreTotal: 22 },
{ person: 'Mary', scoreTotal: 14 },
{ person: 'Bob', scoreTotal: 33 },
{ person: 'Bob', scoreTotal: 22 },
{ person: 'Joe', scoreTotal: 28 }]
有没有办法使用像 Lodash 这样的东西来实现这一点?
我认为我正朝着正确的方向前进,但还不完全正确:
for (var i = 0; i < t.length - 1; i++) {
if (
t[i].golfer === t[i + 1].golfer &&
t[i].scoreTotal < t[i + 1].scoreTotal
) {
delete t[i];
}
//删除“未定义条目”
t = t.filter(function(el) {
return typeof el !== "undefined";
});
console.log(t);
最佳答案
无需 Underscore/Lodash,您也可以非常简单地完成此操作。按分数从高到低对数组进行排序。然后使用 Array.filter .当过滤器遍历数组时,跟踪您看到每个人的次数,并在达到您想要的人的最高次数后开始返回 false。
let arr = [ { person: 'Fred', scoreTotal: 29 },{ person: 'Alice', scoreTotal: 34 },{ person: 'Alice', scoreTotal: 22 },{ person: 'Mary', scoreTotal: 14 },{ person: 'Bob', scoreTotal: 33 },{ person: 'Bob', scoreTotal: 13 },{ person: 'Bob', scoreTotal: 22 },{ person: 'Joe', scoreTotal: 28 }]
function filterTop(arr, top) {
let counts = {}
return [...arr].sort((a, b) => b.scoreTotal - a.scoreTotal)
.filter(score => (counts[score.person] = (counts[score.person] || 0) +1 ) <= top)
}
console.log(filterTop(arr, 1))
console.log(filterTop(arr, 2))
关于javascript - 如何根据javascript中的最大值从对象数组中删除一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51256612/