JavaScript-使用count在对象数组中查找唯一值,并创建一个新的对象数组

JavaScript-使用count在对象数组中查找唯一值,并创建一个新的对象数组,javascript,arrays,object,filtering,Javascript,Arrays,Object,Filtering,我有一个对象数组,如下所示: var arr =[ { price:20, rule:a }, { price:10, rule:b }, { price:5, rule:a }, { price:50, rule:b }, { price:70, rule:b } ] var filteredArr = [ { rule:a, countOfRule:2, minPriceForThisRule:5 }, {

我有一个对象数组,如下所示:

var arr =[
 {
  price:20,
  rule:a
 },
 {
  price:10,
  rule:b
 },
 {
  price:5,
  rule:a
 },
 {
  price:50,
  rule:b
 },
 {
  price:70,
  rule:b
 }
]
var filteredArr = [
 {
  rule:a,
  countOfRule:2,
  minPriceForThisRule:5
 },
 {
  rule:b,
  countOfRule:3,
  minPriceForThisRule:10
 }
]
我想从中提取一个对象数组,如下所示:

var arr =[
 {
  price:20,
  rule:a
 },
 {
  price:10,
  rule:b
 },
 {
  price:5,
  rule:a
 },
 {
  price:50,
  rule:b
 },
 {
  price:70,
  rule:b
 }
]
var filteredArr = [
 {
  rule:a,
  countOfRule:2,
  minPriceForThisRule:5
 },
 {
  rule:b,
  countOfRule:3,
  minPriceForThisRule:10
 }
]
这意味着:

1) 我想创建一个新数组,在第一个数组“arr”中,对象数作为唯一的规则数

2) 需要计算唯一规则重复次数,并在新数组对象中添加为属性-作为“countOfRule”给定

3) 在唯一规则类别中查找的最低价格-以“minPriceForThisRule”给出

我已经阅读了类似的答案,所以只能得到前2个条件,这也不是我需要的格式

我所尝试的,指的是网站上的链接:

var ff = {},e;
for (var i = 0,l=arr.length; i < l; i++) {
   e = arr[i];
   ff[e.rule] = (ff[e.rule] || 0) + 1;
}
您可以使用和
thisArg
可选参数执行此操作

var arr=[{“价格”:20,“规则”:“a”},{“价格”:10,“规则”:“b”},{“价格”:5,“规则”:“a”},{“价格”:50,“规则”:“b”},{“价格”:70,“规则”:“b”},
r=[];
arr.forEach(功能(e){
如果(!此[e.规则]){
此[e.rule]={rule:e.rule,countOfRule:0,MinPrice for此rule:e.price}
r、 推(这个[规则]);
}
这是[e.规则].countOfRule++;
如果(此[e.rule].minPriceForThisRule>e.price)此[e.rule].minPriceForThisRule=e.price;
}, {});
console.log(r)
您可以使用和
thisArg
可选参数执行此操作

var arr=[{“价格”:20,“规则”:“a”},{“价格”:10,“规则”:“b”},{“价格”:5,“规则”:“a”},{“价格”:50,“规则”:“b”},{“价格”:70,“规则”:“b”},
r=[];
arr.forEach(功能(e){
如果(!此[e.规则]){
此[e.rule]={rule:e.rule,countOfRule:0,MinPrice for此rule:e.price}
r、 推(这个[规则]);
}
这是[e.规则].countOfRule++;
如果(此[e.rule].minPriceForThisRule>e.price)此[e.rule].minPriceForThisRule=e.price;
}, {});

log(r)
我会使用reduce。比如:

var reduced = arr.reduce(function(memo, obj){
   var rule = memo[obj.rule];
   rule.countOfRule++;
   if(!rule.minPriceForThisRule){
     rule.minPriceForThisRule = obj.price;
   } else{
     if(obj.price < rule.minPriceForThisRule){
       rule.minPriceForThisRule = obj.price;
     }
   }
   return memo;
}, map);
当然,如果需要,您可以动态创建地图


我会使用reduce。比如:

var reduced = arr.reduce(function(memo, obj){
   var rule = memo[obj.rule];
   rule.countOfRule++;
   if(!rule.minPriceForThisRule){
     rule.minPriceForThisRule = obj.price;
   } else{
     if(obj.price < rule.minPriceForThisRule){
       rule.minPriceForThisRule = obj.price;
     }
   }
   return memo;
}, map);
当然,如果需要,您可以动态创建地图


我就是这样做的

var-arr=[
{
价格:20,,
规则:“a”
},
{
价格:10,,
规则:“b”
},
{
价格:5,,
规则:“a”
},
{
价格:50,,
规则:“b”
},
{
价格:70,
规则:“b”
}
],
reduced=arr.reduce((p,c)=>{var fo=p.find(f=>f.rule==c.rule);
fo?(fo.countOfRule++,
fo.minPriceForThisRule>c.price&(fo.minPriceForThisRule=c.price))
:p.push({rule:c.rule,countOfRule:1,minPriceForThisRule:c.price});
返回p;
},[]);

控制台日志(减少)我就是这样做的

var-arr=[
{
价格:20,,
规则:“a”
},
{
价格:10,,
规则:“b”
},
{
价格:5,,
规则:“a”
},
{
价格:50,,
规则:“b”
},
{
价格:70,
规则:“b”
}
],
reduced=arr.reduce((p,c)=>{var fo=p.find(f=>f.rule==c.rule);
fo?(fo.countOfRule++,
fo.minPriceForThisRule>c.price&(fo.minPriceForThisRule=c.price))
:p.push({rule:c.rule,countOfRule:1,minPriceForThisRule:c.price});
返回p;
},[]);

控制台日志(减少)向我们展示你所做的@NafiulIslam-更新,我尝试过的。@mplungjan-抱歉,我没有理解。你能再解释一下吗?让我们看看你做了什么@NafiulIslam-更新,我尝试过的。@mplungjan-抱歉,我没有理解。你能再解释一下吗。谢谢,让我试试这个。嘿,只是出于好奇,你怎么能这么快就想出这样一个答案。建立这一逻辑和所有。关于这一点,你能给我一些建议吗,比如任何javascript算法书籍、参考资料等,在这种情况下都能对我有所帮助。这只是一个标准模式,没有完全复制。我从比我更聪明、更有经验的开发人员那里学会了解决这样的问题,但也有一些好的学习场所,再次感谢你的推荐。是的,我也在做同样的事情,就目前而言:-)谢谢,让我试试这个。嘿,只是出于好奇,你怎么会这么快就想出这样的答案。建立这一逻辑和所有。关于这一点,你能给我一些建议吗,比如任何javascript算法书籍、参考资料等,在这种情况下都能对我有所帮助。这只是一个标准模式,没有完全复制。我从比我更聪明、更有经验的开发人员那里学会了解决这样的问题,但也有一些好的学习场所,再次感谢你的推荐。是的,就目前而言,我也在做同样的事情:-)