过滤JSON阵列使所有MAX值在JavaScript
这是原始数组,过滤JSON阵列使所有MAX值在JavaScript
var dates =
[ { user_id: '1', week_number: '2', amount: '100' },
{ user_id: '1', week_number: '2', amount: '100' },
{ user_id: '1', week_number: '2', amount: '100' },
{ user_id: '1', week_number: '3', amount: '100' },
{ user_id: '3', week_number: '3', amount: '100' } ]
更新
首先,我试图排序最高week_number
值阵列:
var x = dates.sort(function (itemA, itemB) {
return itemA.week_number < itemB.week_number;
});
得到:
[ { user_id: '1', week_number: '3', amount: '100' },
{ user_id: '3', week_number: '3', amount: '100' },
{ user_id: '1', week_number: '2', amount: '100' },
{ user_id: '1', week_number: '2', amount: '100' },
{ user_id: '1', week_number: '2', amount: '100' } ]
,然后use.filter得到
[ { user_id: '1', week_number: '3', amount: '100' },
{ user_id: '3', week_number: '3', amount: '100' },]
后来我发现reduce
方法,但它只返回最高week_number
值的对象。
var max = dates.reduce(function(prev, current) {
return (prev.week_number > current.week_number) ? prev : current
})
正如你所见,.filter
将完成工作。
非常感谢您提供的所有答案。你是最棒的!!!
使用map
方法来获取所有的week_number
。获得此数组中最大的,现在在filter
方法使用该最大值得到匹配对象
var dates = [{
user_id: '1',
week_number: '2',
amount: '100'
},
{
user_id: '1',
week_number: '2',
amount: '100'
},
{
user_id: '4',
week_number: '4',
amount: '100'
},
{
user_id: '1',
week_number: '2',
amount: '100'
},
{
user_id: '1',
week_number: '3',
amount: '100'
},
{
user_id: '3',
week_number: '3',
amount: '100'
}
]
var o = dates.map(function(item) {
return +item.week_number;
}).sort(function(a, b) {
return a - b
})[dates.length - 1]
console.log(o)
var m = dates.filter(function(elem) {
return elem.week_number === o.toString();
})
console.log(m)
EDIT
在上面的代码中的地图功能冗余的,排序的日期将给予最大WEEK_NUMBER的对象,那么滤波器可用于获得所需的结果
var dates = [{
user_id: '1',
week_number: '2',
amount: '100'
},
{
user_id: '1',
week_number: '2',
amount: '100'
},
{
user_id: '4',
week_number: '4',
amount: '100'
},
{
user_id: '1',
week_number: '2',
amount: '100'
},
{
user_id: '1',
week_number: '3',
amount: '100'
},
{
user_id: '3',
week_number: '3',
amount: '100'
}
]
var o = dates.sort(function(a, b) {
return a.week_number - b.week_number
})[dates.length - 1]
var m = dates.filter(function(elem) {
return elem.week_number === o.week_number;
})
console.log(m)
是的!非常感谢:] –
如果在数组中间有'{user_id:'4',week_number:'4',amount:'100'}',那么这将不起作用 – RomanPerekhrest
为什么'.map()'? OP的原始'.reduce()'会更好(有些修复)。如果你可以假定最大的'week_number'在最后,'.map()'是完全多余的,因为你可以做'var o = dates [dates.length-1] .week_number' – 2017-11-11 16:49:49
您可以通过检查week_number
来使用单循环方法,并在必要时替换结果集。
var dates = [{ user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '3', amount: '100' }, { user_id: '3', week_number: '3', amount: '100' }],
result = dates.reduce(function (r, o, i) {
return !i || r[0].week_number < o.week_number
? [o]
: r[0].week_number === o.week_number
? r.concat(o)
: r;
}, []);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
如果会有'{user_id:'4',week_number:'4',amount:'100'}'作为最后一项 – RomanPerekhrest
@RomanPerekhrest,那么这是行不通的,对,我认为id应该得到尊重。无论如何, –
似乎OP不考虑任何其他方法 – RomanPerekhrest
reduce
可能不是此任务的最佳工具。相反,循环式的解决方案可能是更好:
var maxWeek = 0;
var max = [];
dates.forEach(function(date) {
const week = date.week_number;
if (week > maxWeek) {
maxWeek = week;
max = [date];
}
else if (week === maxWeek) {
max.push(date);
}
});
注:我没有测试此代码,所以我不能保证没有错误的。
随着Array.sort()
功能:
的第一个示例用额外的项目扩展:
var dates = [{ user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '3', amount: '100' }, { user_id: '3', week_number: '3', amount: '100' }, { user_id: '4', week_number: '4', amount: '100' }],
result = [];
dates.sort(function(a, b){ return +b.week_number - +a.week_number; });
result.push(dates[0]);
for (var i=2, len = dates.length; i<=len; i++) {
if (dates[i].week_number != result[0].week_number) break;
result.push(dates[i]);
}
console.log(result);
var res = [], prev, max;
for (var i = 0, len = dates.length; i < len; i++) {
max = parseInt(dates[i].week_number);
if (!res.length) {
prev = max; res.push(dates[i]);
} else if (prev === max) {
res.push(dates[i]);
} else if (max > prev) {
prev = max; res.length = 0; res.push(dates[i]);
}
}
鉴于名单上week_number
排序,它只是一个简单的反向循环。
var dates = [{ user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '3', amount: '100' }, { user_id: '3', week_number: '3', amount: '100' }];
var i = dates.length;
var last = dates[--i];
while (--i !== -1 && dates[i].week_number === last.week_number) {
}
var res = dates.slice(i+1);
console.log(res);
或者使用,虽然你没有得到制止环。
var dates = [{ user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '3', amount: '100' }, { user_id: '3', week_number: '3', amount: '100' }];
var res = dates.reduceRight((a, obj) =>
a.length && obj.week_number !== a[a.length-1].week_number ? a : [obj, ...a]
, []);
console.log(res);
但是,如果你不能依赖列表的排序顺序,那么你应该使用.reduce()
你已经写了,并在.filter()
使用它的结果操作。
var dates = [{ user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '3', amount: '100' }, { user_id: '3', week_number: '3', amount: '100' }];
var max = dates.reduce((p, c) => +p.week_number > +c.week_number ? p : c).week_number;
var res = dates.filter(d => d.week_number == max)
console.log(res);
比它应该表现出数组对象包含' '4'' –
我的意思是,如果只有一个项目'WEEK_NUMBER:' 4''和多个'WEEK_NUMBER:“3 ''? – RomanPerekhrest
如果你可以保证列表是'week_number'排序,那么你所需要做的就是在最后开始一个循环,并在'week_number'中断时包含'week_number:'max'' –