比较对象的JavaScript数组以同时获得具有2个属性的最小/最大值

比较对象的JavaScript数组以同时获得具有2个属性的最小/最大值,javascript,Javascript,我想得到成本最低的物品,如果其中许多物品的成本相同,我想得到计数最高的物品,如果还有多个,我想得到一个随机物品 var items = [ {"ID": 1, "Cost": 200, "Count": 4}, {"ID": 2, "Cost": 1000, "Count": 2}, {"ID": 3, "Cost": 50, "Count": 10}, {"ID": 4, "Cost": 50, "Count": 10}, {"ID": 5, "Cost

我想得到成本最低的物品,如果其中许多物品的成本相同,我想得到计数最高的物品,如果还有多个,我想得到一个随机物品

var items = [
    {"ID": 1, "Cost": 200, "Count": 4},
    {"ID": 2, "Cost": 1000, "Count": 2},
    {"ID": 3, "Cost": 50, "Count": 10},
    {"ID": 4, "Cost": 50, "Count": 10},
    {"ID": 5, "Cost": 50, "Count": 10},
    {"ID": 6, "Cost": 50, "Count": 8}
]
var lowestCost=items.reduce(函数(上、当前){
返回上一个成本<当前成本?上一个:当前;
});
这是获得最低成本的方法,任何同时进行其他比较的简单方法?

prev.cost===curr.cost&&prev.Count>curr.Count | prev.costvar lowestCost = items.reduce(function(prev, curr) {
    return prev.Cost < curr.Cost ? prev : curr;
});
? 上 :curr 或者更聪明一些:

  prev.Cost === curr.Cost && prev.Count > curr.Count || prev.Cost < curr.Cost
     ? prev
     :  curr
((上一成本-当前成本)| |(上一计数-当前计数))<0
? 咖喱
:上
prev.Cost===curr.Cost&&prev.Count>curr.Count | | prev.Cost
或者更聪明一些:

  prev.Cost === curr.Cost && prev.Count > curr.Count || prev.Cost < curr.Cost
     ? prev
     :  curr
((上一成本-当前成本)| |(上一计数-当前计数))<0
? 咖喱
:上

一个不那么随机的解决方案:

const项=[
{“ID”:1,“Cost”:200,“Count”:4},
{“ID”:2,“Cost”:1000,“Count”:2},
{“ID”:3,“成本”:50,“计数”:10},
{“ID”:4,“成本”:50,“计数”:10},
{“ID”:5,“成本”:50,“计数”:10},
{“ID”:6,“成本”:50,“计数”:8}
];
const computeLowestCost=()=>{
返回项目。减少(功能(上一个、当前){
常量isEqualPriceAndCount=(上一成本==当前成本)
&&(上一次计数===当前计数);
如果(isEqualPriceAndCount){
//如果价格和数量相同,则返回随机项目
return(!!Math.round(Math.random()))
?上
:货币;
}
return!!((上一成本<当前成本)| |(上一计数>当前计数))
?上
:货币;
});
}
const lowestCost=computeLowestCost();
控制台日志(最低成本);
//随机性…不是随机的,因为
//第一件物品有1/2*1/2*1/2的剩余机会
//第二件物品有1/2*1/2的机会保留
//第三项有1/2的机会保留
const results={};
对于(设i=0;i<1000000;i++){
const res=computeLowestCost();
结果[res.ID]=!!结果[res.ID]
?++结果[res.ID]
: 1;
}

console.log(结果)
一个不那么随机的解决方案:

const项=[
{“ID”:1,“Cost”:200,“Count”:4},
{“ID”:2,“Cost”:1000,“Count”:2},
{“ID”:3,“成本”:50,“计数”:10},
{“ID”:4,“成本”:50,“计数”:10},
{“ID”:5,“成本”:50,“计数”:10},
{“ID”:6,“成本”:50,“计数”:8}
];
const computeLowestCost=()=>{
返回项目。减少(功能(上一个、当前){
常量isEqualPriceAndCount=(上一成本==当前成本)
&&(上一次计数===当前计数);
如果(isEqualPriceAndCount){
//如果价格和数量相同,则返回随机项目
return(!!Math.round(Math.random()))
?上
:货币;
}
return!!((上一成本<当前成本)| |(上一计数>当前计数))
?上
:货币;
});
}
const lowestCost=computeLowestCost();
控制台日志(最低成本);
//随机性…不是随机的,因为
//第一件物品有1/2*1/2*1/2的剩余机会
//第二件物品有1/2*1/2的机会保留
//第三项有1/2的机会保留
const results={};
对于(设i=0;i<1000000;i++){
const res=computeLowestCost();
结果[res.ID]=!!结果[res.ID]
?++结果[res.ID]
: 1;
}

log(results)
您可以获得一个精简数据集数组,然后获取一个随机对象

var items=[{ID:1,成本:200,计数:4},{ID:2,成本:1000,计数:2},{ID:3,成本:50,计数:10},{ID:4,成本:50,计数:10},{ID:5,成本:50,计数:10},{ID:6,成本:50,计数:8}],
结果=项目。减少((r,o)=>{
如果(!r | | r[0]。成本>o.成本| | r[0]。成本==o.成本和r[0]。计数

.as console wrapper{max height:100%!important;top:0;}
您可以获得一个简化数据集数组,然后获取一个随机对象

var items=[{ID:1,成本:200,计数:4},{ID:2,成本:1000,计数:2},{ID:3,成本:50,计数:10},{ID:4,成本:50,计数:10},{ID:5,成本:50,计数:10},{ID:6,成本:50,计数:8}],
结果=项目。减少((r,o)=>{
如果(!r | | r[0]。成本>o.成本| | r[0]。成本==o.成本和r[0]。计数

。作为控制台包装器{max height:100%!important;top:0;}
因此,一个不那么简单的方法是在之后执行另一个三元函数,以确定它是否等于或大于。然后我们会有另一个三元数来计算哪个三元数更高等等

  ((prev.Cost - curr.Cost) || (prev.Count - curr.Count)) < 0 
     ? curr
     : prev
var项目=[
{“ID”:1,“Cost”:200,“Count”:4},
{“ID”:2,“Cost”:1000,“Count”:2},
{“ID”:3,“成本”:50,“计数”:10},
{“ID”:4,“成本”:50,“计数”:10},
{“ID”:5,“成本”:50,“计数”:10},
{“ID”:6,“成本”:50,“计数”:8}
]
var lowestCost=项目。减少(功能(上一个,当前){
返回上一成本当前计数?上一计数):当前);
});

因此,一种不那么简单的方法是在之后再进行另一个三元运算,以确定它是否等于或大于。然后我们会有另一个三元数来计算哪个三元数更高等等

  ((prev.Cost - curr.Cost) || (prev.Count - curr.Count)) < 0 
     ? curr
     : prev
var项目=[
{“ID”:1,“Cost”:200,“Count”:4},
{“ID”:2,“成本”