使用 JavaScript 查找重复条目的最大值

Using JavaScript to find the highest value for duplicate entries

我有一个文档库对象。在该对象中,每个文档都有一个 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
  }
]

我举个例子:

首先,将数据结构从数组转换为映射,其中键是 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])
    })
}

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