在 JSON 个对象的数组中搜索最大值

Searching for max value in an array of JSON objects

我有一个 JSON 对象数组,如下例所示:

    [ { _id: 58d98fc46cb2342d6848ae3,
    updateNumber: '1',
    resolution: 'tbd',
    nextUpdate: Mon Mar 27 2017 17:06:00 GMT-0400 (EDT),
    update: 'update 1',
    subject: 'test1',
    impact: 'test1',
    incidentNumber: '12345',
    wasNew: true,
    __v: 0 },
  { _id: 58d880126fb5087d684c8de4,
    updateNumber: '2',
    resolution: 'tbd',
    nextUpdate: Mon Mar 27 2017 18:06:00 GMT-0400 (EDT),
    update: 'update 2',
    subject: 'test1',
    impact: 'test1',
    incidentNumber: '12345',
    wasNew: true,
    __v: 0 },
  { _id: 58c23ae21bt2743d6328ae3,
    updateNumber: '1',
    resolution: 'tbd',
    nextUpdate: Mon Mar 27 2017 17:06:00 GMT-0400 (EDT),
    update: 'update 1',
    subject: 'test2',
    impact: 'test2',
    incidentNumber: '23456',
    wasNew: true,
    __v: 0 } ]

我需要做的是为每个事件编号获取最新更新。每个 incidentNumber 都会有多个更新,我希望能够检索最新的更新(在上面的示例中,incidentNumber 12345 的更新 2 和 incidentNumber 23456 的更新 1)

到目前为止,我已经尝试了 _.max 的变体,它只适用于一个事件编号,而不适用于多个。

我进行了广泛的搜索,到目前为止还没有发现任何涉及我所拥有的相同数据集的问题。

任何人都可以为我指出正确的方向来解决这个问题吗?

谢谢

您可以先选择您想要的 incidentNumber 项,然后从中选择最大 updateNumber 项。 在 es6 语法中,它看起来像这样,假设您的数据在 data 变量

data
 .filter(d => d.incidentNumber === '12345')
 .reduce((o, e) => o.updateNumber && o.updateNumber > e.updateNumber ? o : e, {})

在 es5 语法中它有点冗长

data
  .filter(function(d) { return d.incidentNumber === '12345'; })
  .reduce(function(o, e) { return  o.updateNumber && o.updateNumber > e.updateNumber ? o : e}, {})

或者您可以进行一次过滤并获得最大值

data.reduce(function(o, e) { return (e.incidentNumber === '12345' &&  o.updateNumber && o.updateNumber > e.updateNumber) ? o : e}, {})

要为每个唯一事件编号获取具有最大 updateNumber 的对象,您可以在减少时维护由事件编号索引的对象的哈希值

var results = data.reduce(function (m, e) {
    if (e.updateNumber && (!m[e.incidentNumber] || m[e.incidentNumber].updateNumber < e.updateNumber)) {
        m[e.incidentNumber] = e;
    }
    return m;
}, {});

Object.values(results); // will contain the array of objects with max updateNumber

要获取所有 事件的最新更新,您可以执行以下操作:

  • arr 是您的事件数组
  • id 是您的标识符
  • counter就是你比较的值
function getLatestUpdate(arr, id, counter) {
  var _latest = [];
  var latest = [];

  while (arr.length) {
    var item = arr.shift();
    var currentUpdate = _latest[item[id]];

    _latest[item[id]] = (!currentUpdate) ? item : (currentUpdate[counter] > item[counter] ? currentUpdate : item);
  }

  for(key in _latest) {
    latest.push(_latest[key]);
  }

  return latest;
}

var latest = getLatestUpdate(arr, '_id', 'updateNumber');

If 可能不是最有效的,但它利用数组作为对象并在过滤数组时比较对象计数器的值,然后在完成时将存在的对象推送到数组并销毁 key/value 对存储在那里。

最简单(最快,none 破坏性)的方法是使用地图对象,如下所示:

function getLatest(arr) {
  map = {};
    arr.forEach(item => {
    var i = item.incidentNumber;
    if (!map[i] || map[i].updateNumber<item.updateNumber) {
        map[i] = item;
    }
  })
  return Object.keys(map).map(key => map[key])
}