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

Javascript 在JSON对象数组中搜索最大值,javascript,json,underscore.js,Javascript,Json,Underscore.js,我有一个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

我有一个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)

到目前为止,我已经尝试了u0.max的变体,它只适用于一个incidentNumber,而不适用于多个incidentNumber

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

有人能给我指出解决这个问题的正确方向吗


谢谢

您可以这样做,首先选择您想要的带有
incidentNumber
的项目,然后从这些项目中选择带有max
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}, {})
要为每个唯一的事件编号获取具有max 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
var结果=数据.reduce(函数(m,e){
if(e.updateNumber&(!m[e.incidentNumber]| | m[e.incidentNumber].updateNumber
您可以这样做,首先选择您想要的带有
incidentNumber
的项目,然后从中获取带有max
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}, {})
要为每个唯一的事件编号获取具有max 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
var结果=数据.reduce(函数(m,e){
if(e.updateNumber&(!m[e.incidentNumber]| | m[e.incidentNumber].updateNumber
要获取所有事件的最新更新,您可以在以下位置执行操作:

  • arr是您的一系列事件
  • id是您的标识符
  • 计数器是您正在比较的值
函数getLatestUpdate(arr、id、计数器){ var_latest=[]; var latest=[]; while(arr.length){ var item=arr.shift(); var currentUpdate=_最新[项目[id]]; _最新的[项目[id]=(!currentUpdate)?项目:(currentUpdate[计数器]>项目[计数器]?currentUpdate:项目); } 用于(输入最新版本){ latest.push(_latest[key]); } 返回最新版本; } var latest=getLatestUpdate(arr,“_id”,“updateNumber”);
If可能不是最有效的,但它利用了数组作为对象的优势,并在过滤数组时比较对象计数器的值,然后在完成后将存在的对象推送到数组中,并销毁存储在其中的键/值对。

要获得所有事件的最新更新,可以在以下位置执行操作:

  • arr是您的一系列事件
  • id是您的标识符
  • 计数器是您正在比较的值
函数getLatestUpdate(arr、id、计数器){ var_latest=[]; var latest=[]; while(arr.length){ var item=arr.shift(); var currentUpdate=_最新[项目[id]]; _最新的[项目[id]=(!currentUpdate)?项目:(currentUpdate[计数器]>项目[计数器]?currentUpdate:项目); } 用于(输入最新版本){ latest.push(_latest[key]); } 返回最新版本; } var latest=getLatestUpdate(arr,“_id”,“updateNumber”); If可能不是最有效的,但它利用数组作为对象,在过滤数组时比较对象计数器的值,然后在完成后将存在的对象推送到数组中,并销毁存储在数组中的键/值对。

最简单(最快且无破坏性)方法是使用贴图对象,如下所示:

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])
}
函数getLatest(arr){
map={};
arr.forEach(项目=>{
var i=项目编号;
if(!map[i]| | map[i].updateNumber map[key])
}
最简单(最快且无破坏性)的方法是使用贴图对象,如下所示:

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])
}
函数getLatest(arr){
map={};
arr.forEach(项目=>{
var i=项目编号;
if(!map[i]| | map[i].updateNumber map[key])
}

您必须迭代到所有列表项,获取
updateNumber
。您只需要将列表索引存储到
updateNumber所在的最高位置。然后您就知道需要在列表中的何处获取
意外编号“”。您必须迭代到所有列表项,获取
updateNumber
。您只需要存储列表索引例如,
updateNumber的最高位置。这样您就知道需要在列表中的何处获取
incidentNumber`。就我个人而言,我会取消
过滤器
回调,而改为在
减少
回调中处理过滤。这样可以避免重复数据两次。是的,这也会起作用,这稍微有些复杂但是你是对的,它会重复两次。让我用这个版本更新答案too@gabesoft也许我疯了,不知道我在说什么,但我似乎无法让这个例子起作用。我在JSFIDLE中尝试了它,但没有成功,你能用e吗