Javascript 在JSON对象数组中搜索最大值
我有一个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
[ { _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
的项目,然后从这些项目中选择带有maxupdateNumber
的项目。
在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
的项目,然后从中获取带有maxupdateNumber
的项目。
在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是您的标识符
- 计数器是您正在比较的值
If可能不是最有效的,但它利用了数组作为对象的优势,并在过滤数组时比较对象计数器的值,然后在完成后将存在的对象推送到数组中,并销毁存储在其中的键/值对。要获得所有事件的最新更新,可以在以下位置执行操作:
- arr是您的一系列事件
- id是您的标识符
- 计数器是您正在比较的值
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吗