【问题标题】:how to filter duplicates by the length of a property value如何按属性值的长度过滤重复项
【发布时间】:2020-04-16 20:52:25
【问题描述】:

我有一个重复的对象数组。它应该有重复,但它需要限制在其中一个属性值中的月数。

const DATA = [
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "WAYZETTA 67-2536H",
    "entityId": 31135395,
    "selectedColumn": "Mar",
    "selectedColumns": "Mar"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  }
]

const DESIRED_RESULT = [
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "WAYZETTA 67-2536H",
    "entityId": 31135395,
    "selectedColumn": "Mar",
    "selectedColumns": "Mar"
  }
]

我已经给出了期望的结果。每个 wellName(例如 MARYS DRAW 461-2227H)都会有一个属性 selectedColumns 和一串月份。我需要将重复项限制为相同的月数,并且每个重复项都需要将 3 个月中的一个设置为 selectedColumn。

【问题讨论】:

  • 什么具体表示重复,当遇到重复时会发生什么?拿第一个?最后一个?有关系吗?
  • 根本不重要
  • 您自己尝试过吗?结果如何?我们可以看到代码吗?
  • 所以您要确保输出数组中没有两个对象具有相同的selectedColumnselectedColumns 值?
  • ^^^ 还是只检查 entityId 就足够了?您需要具体检查哪些“重复”是否属实

标签: javascript jquery lodash


【解决方案1】:

这可能是您正在寻找的:

let result = [];
let filter = {};
let col, cols;

// Iterate through every element
data.forEach(datum => {
  col = datum.selectedColumn;
  cols = datum.selectedColumns;
  // Add selectedColumns value if not already tracked
  if (!filter[cols]) {
    filter[cols] = [];
  }
  // Make sure element with same selectedColumn value doesn't already exist
  if (filter[cols].indexOf(col) === -1) {
    filter[cols].push(col);
    result.push(datum);
  }
})

基本上,它所做的是跟踪找到的 selectedColumns 值,然后将每个值映射到存储 selectedColumn 值的数组,并确保它们在结果中不重复。

【讨论】:

  • 如果这是正确的,那么entityId/wellName 字段根本不重要。但是在上面的 cmets 中,提到了MARY,这让我怀疑这会在不同的数据上失败,如果说我们用Jan Feb / Jan 附加了另一个实体(比如JOSEPHS DRAW)。这将被排除在第一个副本之外。我认为这不是我们想要的。
  • 非常正确,这会是@texas697 的问题吗?
  • 我的答案通过从数据生成密钥来解决它。这并不总是可能的,但是当它起作用时,我发现它比使用这种手动检查更简单。
  • @ScottSauyet 你是对的。我确实遇到了这个问题。但是我能够解决问题的根源,不再需要快速解决
【解决方案2】:

我解决此类问题的一种方法是将我的列表临时折叠到一个对象中,其中键由对象的重要部分组成,并且值(在这种情况下)是现有结果(如果存在的话)或当前结果。这只是一个reduce 然后我只取这个对象的值,忽略键,使用Object .values

这是一种方法:

const dedupe = data => Object .values (data .reduce ((
  a, entry, _, __, 
  key = `${entry .entityId} | ${entry .selectedColumn} | ${entry .selectedColumns}`
) => ({...a, [key]: a [key] || entry}), {}))

const DATA = [{wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "WAYZETTA 67-2536H", entityId: 31135395, selectedColumn: "Mar", selectedColumns: "Mar"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}];

console .log (dedupe (DATA))

根据数据,我假设我们只需要匹配entityId,即wellNameentityId 始终相关。如果这是错误的,那么很容易将井名添加到键中。

这段代码唯一有点棘手的地方是将参数内的key 分配给reduce。我喜欢这种方法,因为它使我的函数体成为一个单一的表达式。但是在这里,在reduce 回调中,由于reduce 提供给您的第三和第四个参数(索引和数组),这有点尴尬。我只是通过提供未使用的参数___ 来忽略它们。但也可以是iarr 或其他任何东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 2021-05-09
    • 2018-04-26
    • 2015-02-20
    • 1970-01-01
    • 2011-05-31
    相关资源
    最近更新 更多