NodeJS:Array.reduce 在对象数组中查找最小值和最大值
NodeJS: Array.reduce to find Min and Max in an Array of Objects
我有一个对象数组,如下所示:
test = {
bar: [
{p: '1',
v: '2',
sn: '1509007228'
},
{p: '34',
v: '3',
sn: '1509007228'
},
{p: '0.5',
v: '4',
sn: '1509007228'
}],
foo: [
{p: '1',
v: '2',
sn: '1509007228'
},
{p: '34',
v: '3',
sn: '1509007228'
},
{p: '0.5',
v: '4',
sn: '1509007228'
}]
}
而且我发现 SO 上的这个函数就像一个魅力...即使我不确定由于 reduce 函数是 supposed 到 return 和 accumulator first and then the current value.我不确定如何处理累加器,因为它应该 return undefined
,但我想这是另一个时间和地点的问题!
所以这是 function(感谢 Tristan Reid):
Array.prototype.hasMin = function(attrib) {
return this.reduce(function(prev, curr){
return prev[attrib] < curr[attrib] ? prev : curr;
});
}
当我在之前的对象上使用它时,它完美地工作:
var blu = test.foo.hasMin('p');
{ p: '0.5', v: '4', sn: '1509007228' }
如果我颠倒逻辑,结果是正确的:即。试图找到最高值:
Array.prototype.hasMin = function(attrib) {
return this.reduce(function(prev, curr) {
return prev[attrib] > curr[attrib] ? prev : curr;
});
};
我想我可以称它为 hasMax...但你知道,它现在相对无关紧要。
var blu = test.foo.hasMin('p');
{ p: '34', v: '3', sn: '1509007228' }
但是当我尝试在实际对象上使用它时(很多很多)它似乎停在一个特定的值上:999.00
Here's the full object(对于大小,我深表歉意...因为它(> 70,000 行),我无法将其粘贴到此处)。
当我尝试 'hasMax' 函数时,我得到:
var bar = foo.bids.hasMin('p');
{ sn: '1509007228', v: '53.00000000', p: '999.00', type: 'bids' }
当“p”Max 的正确对象应该是:
{
sn: '1509007228',
v: '0.15200000',
p: '5721.32',
type: 'bids'
},
我不确定 array.reduce
函数是否存在限制,导致此函数无法对我的对象起作用?
无论如何,在此先感谢您的帮助!
请更改您的代码,使其看起来像这样:
return parseFloat(prev[attrib]) > parseFloat(curr[attrib]) ? prev : curr;
你的p是一个字符串
p: '5721.32'
所以你在应该比较数字的时候比较字符串。
我有一个对象数组,如下所示:
test = {
bar: [
{p: '1',
v: '2',
sn: '1509007228'
},
{p: '34',
v: '3',
sn: '1509007228'
},
{p: '0.5',
v: '4',
sn: '1509007228'
}],
foo: [
{p: '1',
v: '2',
sn: '1509007228'
},
{p: '34',
v: '3',
sn: '1509007228'
},
{p: '0.5',
v: '4',
sn: '1509007228'
}]
}
而且我发现 SO 上的这个函数就像一个魅力...即使我不确定由于 reduce 函数是 supposed 到 return 和 accumulator first and then the current value.我不确定如何处理累加器,因为它应该 return undefined
,但我想这是另一个时间和地点的问题!
所以这是 function(感谢 Tristan Reid):
Array.prototype.hasMin = function(attrib) {
return this.reduce(function(prev, curr){
return prev[attrib] < curr[attrib] ? prev : curr;
});
}
当我在之前的对象上使用它时,它完美地工作:
var blu = test.foo.hasMin('p');
{ p: '0.5', v: '4', sn: '1509007228' }
如果我颠倒逻辑,结果是正确的:即。试图找到最高值:
Array.prototype.hasMin = function(attrib) {
return this.reduce(function(prev, curr) {
return prev[attrib] > curr[attrib] ? prev : curr;
});
};
我想我可以称它为 hasMax...但你知道,它现在相对无关紧要。
var blu = test.foo.hasMin('p');
{ p: '34', v: '3', sn: '1509007228' }
但是当我尝试在实际对象上使用它时(很多很多)它似乎停在一个特定的值上:999.00
Here's the full object(对于大小,我深表歉意...因为它(> 70,000 行),我无法将其粘贴到此处)。
当我尝试 'hasMax' 函数时,我得到:
var bar = foo.bids.hasMin('p');
{ sn: '1509007228', v: '53.00000000', p: '999.00', type: 'bids' }
当“p”Max 的正确对象应该是:
{
sn: '1509007228',
v: '0.15200000',
p: '5721.32',
type: 'bids'
},
我不确定 array.reduce
函数是否存在限制,导致此函数无法对我的对象起作用?
无论如何,在此先感谢您的帮助!
请更改您的代码,使其看起来像这样:
return parseFloat(prev[attrib]) > parseFloat(curr[attrib]) ? prev : curr;
你的p是一个字符串
p: '5721.32'
所以你在应该比较数字的时候比较字符串。