从元组数组中删除重复的x值

时间:2018-06-18 18:23:28

标签: javascript typescript multidimensional-array ecmascript-6

如果元组的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.filterArray.prototype.map等是否可以解决我的问题。我正在尝试使用ES6方法,而不是简单地在提及列表中进行迭代。

4 个答案:

答案 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);