【问题标题】:Remove duplicate x-values from array of tuples从元组数组中删除重复的 x 值
【发布时间】:2018-11-27 15:34:47
【问题描述】:

如果元组的 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 方法,而不仅仅是简单地遍历提到的列表。

【问题讨论】:

  • 向所有及时准确回答的人致敬。你们都是最棒的。
  • 数据排序了吗?你需要原始的内部数组吗?
  • 我正在处理的数据没有排序,也不是预期的。然后我用data.sort((a, b) => a[0] - b[0])进行排序

标签: javascript typescript multidimensional-array ecmascript-6


【解决方案1】:

您可以使用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);

【讨论】:

  • 非常感谢,这正是我所需要的。
  • @JacobMichaelis 很高兴帮助您的朋友,欢迎您:-)
  • 嗨,您的代码运行良好:DI 想在 Google Apps 脚本 (GAS) 中使用它来查找重复的 x 值并平均 y 值,但遗憾的是 GAS 不支持 ES6 (然而)。我尝试重写箭头函数,但后来我得到“a.get 不是函数”作为错误。你知道符合 ES5 的替代方案吗?
  • @Kelvin Map() 在 Es6 中也被引入,所以你也需要更新它。您可以简单地使用普通的 js 对象而不是 map :-)
  • @amrendersingh 谢谢,我已经设法以某种方式重写它。可能效率不高,但现在可以了:)
【解决方案2】:

你喜欢这种东西吗?

var arr = [[0,1],[0,2],[1,1],[1,1],[2,2],[2,2],[2,4],[5,6]]
// var filtered = [[0,2],[1,1],[2,4]]

// temp array to store key value pairs
var items = []
arr.map((item) => {
  let [x, y] = item
  // store the max value of y for this x in items
  if (typeof items[x] === 'undefined'){
    items[x] = y
  }else{
    items[x] = Math.max(items[x], y)
  }
})

var filtered = items.map((y, x) => {
  // rejoin data into x,y pairs
  return [x,y]
}).filter(a => !!a) // fitler undefined pairs

console.log(filtered)

【讨论】:

    【解决方案3】:

    为此,您不想使用过滤器。过滤器更多地用于应用布尔测试来包含或排除元素。如果你真的想使用过滤器,你可以这样做

    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])];
             });
    

    【讨论】:

      【解决方案4】:

      更简洁的选择:您可以使用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);
      

      【讨论】:

        猜你喜欢
        • 2019-10-19
        • 2019-06-12
        • 2014-10-10
        • 2019-03-29
        • 2013-05-20
        • 2011-07-03
        • 1970-01-01
        相关资源
        最近更新 更多