【问题标题】:Using JavaScript to find the highest value for duplicate entries [duplicate]使用 JavaScript 查找重复条目的最大值 [重复]
【发布时间】:2021-09-06 00:50:47
【问题描述】:

我有一个文档库对象。在该对象中,每个文档都有一个 DCN 号和一个版本号。有多个 DCN 条目,我需要过滤掉每个 DCN 的最高版本号。我不确定如何在 JavaScript 中执行此操作。数组示例如下:

[
  {
    'DCN': '1234567',
    'Version': 1.0
  },
  {
    'DCN': '1234567',
    'Version': 2.0
  },
  {
    'DCN': '1234567',
    'Version': 3.0
  },
  {
    'DCN': '1234567',
    'Version': 4.0
  },
  {
    'DCN': '1234568',
    'Version': 1.0
  },
  {
    'DCN': '1234568',
    'Version': 2.0
  },
  {
    'DCN': '1234568',
    'Version': 3.0
  },
  {
    'DCN': '1234568',
    'Version': 4.0
  },
  {
    'DCN': '1234569',
    'Version': 3.0
  },
  {
    'DCN': '1234569',
    'Version': 4.0
  }
]

预期结果如下所示:

[
  {
    'DCN': '1234567',
    'Version': 4.0
  },
  {
    'DCN': '1234568',
    'Version': 4.0
  },
  {
    'DCN': '1234569',
    'Version': 4.0
  }
]

【问题讨论】:

  • 版本号是否存储为浮点数?我想没有打算支持语义版本命名法,例如major.minor.patch(需要存储为字符串而不是数字/浮点数)。
  • 如果你有4.0.14.1.0,我想你会想要4.1.0(因为它是更高的版本号)?
  • 它们是字符串,但我打算将它们转换为数字/浮点数
  • @Terry 是的,这是正确的。 4.1.0 将是最高版本
  • 实际上,即使major.minor 版本转换为浮点数也是有问题的,想想"4.1""4.10" 的版本 - 当您将两者都转换为浮点数时会发生什么

标签: javascript filtering


【解决方案1】:

我将在这里提供一个示例:

首先,您将数据结构从数组转换为映射,其中键是 DCN 值,值是该 DCN 的所有版本号的数组。

const map = {}
for (let item of <your array of objects here>) {
    if (!(item.DCN in map)) {
         map[item.DCN] = []
    }
    map[item.DCN].push(item.value)
}

您现在可以使用Math.max 函数来查找每个DCN 的最大值并将结果放入一个新数组中:

const result = []
for (let DCN in map) {
    result.push({
        DCN,
        value: Math.max(...map[DCN])
    })
}

【讨论】:

  • 效果很好,谢谢!
【解决方案2】:

reduce 可以做到这一点又好又干净。 reduce() 方法对数组的每个元素执行一个 reducer 函数。 reducer 函数是我们将提供的有助于保持最大版本号的函数。

const arr = [
  {
    'DCN': '1234567',
    'Version': 1.0
  },
  {
    'DCN': '1234567',
    'Version': 2.0
  },
  {
    'DCN': '1234567',
    'Version': 3.0
  },
  {
    'DCN': '1234567',
    'Version': 4.0
  },
  {
    'DCN': '1234568',
    'Version': 1.0
  },
  {
    'DCN': '1234568',
    'Version': 2.0
  },
  {
    'DCN': '1234568',
    'Version': 3.0
  },
  {
    'DCN': '1234568',
    'Version': 4.0
  },
  {
    'DCN': '1234569',
    'Version': 3.0
  },
  {
    'DCN': '1234569',
    'Version': 4.0
  }
];

var result = Object.values(arr.reduce((r,o) => {
  if(o.DCN in r) {
    if(o.Version > r[o.DCN].Version)
      r[o.DCN] = Object.assign({},o);
  } else {
    r[o.DCN] = Object.assign({}, o);
  }
  return r;
},{}));

console.log(result);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    相关资源
    最近更新 更多