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

时间:2016-06-14 12:30:19

标签: 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
 },
 {
  rule:b,
  countOfRule:3,
  minPriceForThisRule:10
 }
]

这意味着:

1)我想创建没有的新数组。对象作为唯一编号。第一个数组中的规则" arr"

2)需要计算唯一规则重复并在新数组对象中添加属性 - 以" countOfRule"

的形式给出

3)找出一个独特规则类别的最低价格 - 以" minPriceForThisRule"

为单位

我已经在SO上阅读了类似的答案,并且只能获得前两个条件,而且这也不是我需要的格式。

我尝试过,参考SO上的链接:

var ff = {},e;
for (var i = 0,l=arr.length; i < l; i++) {
   e = arr[i];
   ff[e.rule] = (ff[e.rule] || 0) + 1;
}

但是这只给出了一个对象

{
 a : 2,
 b: 3
}

3 个答案:

答案 0 :(得分:2)

您可以使用forEachthisArg可选参数执行此操作。

var arr = [{"price":20,"rule":"a"},{"price":10,"rule":"b"},{"price":5,"rule":"a"},{"price":50,"rule":"b"},{"price":70,"rule":"b"}], 
    r = [];

arr.forEach(function(e) {
  if(!this[e.rule]) {
    this[e.rule] = {rule: e.rule, countOfRule: 0, minPriceForThisRule: e.price}
    r.push(this[e.rule]);
  }
  this[e.rule].countOfRule++;
  if(this[e.rule].minPriceForThisRule > e.price) this[e.rule].minPriceForThisRule = e.price;
}, {});

console.log(r)

答案 1 :(得分:0)

我会使用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 map = {
  1: {
    rule: 1,
    countOfRule: 0,
    minPriceForThisRule: null      
  },
  2: {
    rule: 2,
    countOfRule: 0,
    minPriceForThisRule: null        
  }
}

当然,如果需要,您可以动态创建地图。

https://plnkr.co/edit/wLw3tEx2SMXmYE7yOEHg?p=preview

答案 2 :(得分:0)

我就是这样做的,

Settings.Builder settings = Settings.settingsBuilder();
settings.put("path.data", "/some/path/data");
settings.put("path.home", "/some/path/home");
settings.put("http.port", 9299);
settings.put("transport.tcp.port", 9399);

// Construct Node without NodeBuilder
List<Class<? extends Plugin>> classpathPlugins = ImmutableList.of(ReindexPlugin.class);
settings.put("node.local", false);
settings.put("cluster.name", "testcluster");
Settings preparedSettings = settings.build();
node = new ExposedNode(InternalSettingsPreparer.prepareEnvironment(preparedSettings, null), Version.CURRENT, classpathPlugins);
node.start();

Arrows可能无法在IE或Safari上运行。如果这是一个问题,请用传统的对应物替换它们。