如果元组的x值在数组中重复,我想从javascript数组中删除项目,在这种情况下,我想获取最大y值并删除其他值。
前:
arr = [[0,1],[0,2],[1,1],[1,1],[2,2],[2,2],[2,4]]
filtered = [[0,2],[1,1],[2,4]]
请帮助我了解Array.prototype.filter
或Array.prototype.map
等是否可以解决我的问题。我正在尝试使用ES6方法,而不是简单地在提及列表中进行迭代。
答案 0 :(得分:3)
您可以使用Array.reduce()
和Array.map()
var data = [[0,1],[0,2],[1,1],[1,1],[2,2],[2,2],[2,4]];
var map = data.reduce((a, arr) => a.set(arr[0], Math.max((a.get(arr[0]) || arr[1]), arr[1])), new Map());
var result = Array.from(map);
console.log(result);

答案 1 :(得分:2)
这是你的事吗?
hive -f

答案 2 :(得分:1)
为此,您不想使用过滤器。过滤器更适用于应用布尔测试以包含或排除元素。如果您真的想使用过滤器,可以执行类似
的操作var newArr = arr.filter(function (elem)
{
allOtherX's = arr.filter(function(secondElem){return elem[0] == secondElem[0]});
return elem[1] >= Math.max(...arr);
});
然而,这是一种无效的方法,因为你将重复很多的卡路里。我建议改为将列表分成一堆基于x值的列表。例如
var buckets = {};
arr.map(function(elem)
{
if(typeof(buckets[elem[0]]) == 'undefined')
buckets[elem[0]] = [];
buckets[elem[0]].push(elem[1]);
return elem; // Unneccessary
});
var newArr = Object.keys(buckets).map(function (x)
{
return [x,Math.max(...buckets[x])];
});
答案 3 :(得分:1)
更清晰的替代方案:您可以使用reduce
来聚合密钥为x
且值为y
的中间哈希,然后将其转换为所需的已过滤数组:
const arr = [[0,1],[0,2],[1,1],[1,1],[2,2],[2,2],[2,4]];
const dataObj = arr.reduce((all, [x,y]) => {
all[x] = Math.max(y, all[x] || 0);
return all;
}, {});
const filtered = Object.keys(dataObj).map(x => [Number(x), dataObj[x]]);
console.log(filtered);