如何使用 lodash 计算多个范围,如 X<10、10<X<100

How to use lodash to calculate many range like X<10, 10<X<100

这是我的数据:

let a = {
  "location": [
 {

   "data_time": "2016-06-23",
   "location_count": 5
 },
 {
   "data_time": "2016-06-23",
   "location_count": 120
 },
 {
   "data_time": "2016-06-24",
   "location_count": 7
 },
 {
   "data_time": "2016-06-24",
   "location_count": 200
 },
]
};

我想计算有多少数据小于 10,介于 10 和 100 之间,或大于 100

最终结果格式为:

[

    {condition: 'Below 10', 20160623: 1, 20160624: 1},
    {condition: 'Between 10 and 100', 20160623: 0, 20160624: 0},
    {condition: 'Greater than 100', 20160623: 1, 20160624: 1},

]

我卡了一会儿如何到达
这是我所做的:

let l = a.location;

let b = _.chain(l)
 .groupBy("data_time")
 .map((data, key)=>{
   let f1 = _.filter(data,(d)=>{
     return d.location_count  < 10
   })

   let f2 = _.filter(data,(d)=>{
     return (d.location_count >= 10 && d.location_count < 100)
   })

   let f3 = _.filter(data,(d)=>{
     return ( d.location_count >= 100)
   })


   return {
     date:key ,"10" :f1.length, "100" : f2.length, 'more than 100': f3.length}
 })
 .value()

console.log(b); 


// result 
[ {
  10: 1,
  100: 0,
  date: "2016-06-23",
  more than 100: 1
},{
  10: 1,
  100: 0,
  date: "2016-06-24",
  more than 100: 1
}]

MyJsBin

一个简单的提议Javascript,它使用10的对数进行分组。

这适用于任何计数和组。

var a = { "location": [{ "data_time": "2016-06-23", "location_count": 5 }, { "data_time": "2016-06-23", "location_count": 120 }, { "data_time": "2016-06-24", "location_count": 7 }, { "data_time": "2016-06-24", "location_count": 200 }] },
    result = function (array) {
        function getCondition(l, first, last) {
            function pow10(l) { return Math.pow(10, l); }
            return first ? 'Below ' + pow10(l + 1) : last ? 'Greater than ' + pow10(l) : 'Between ' + pow10(l) + ' and ' + pow10(l + 1);
        }

        var r = [],
            groups = Object.create(null),
            datesO = Object.create(null),
            datesA;

        array.location.forEach(function (a) {
            var group = Math.floor(Math.log(a.location_count) / Math.log(10)),
                date = a.data_time.split('-').join('');
            groups[group] = groups[group] || { condition: group };
            groups[group][date] = 1;
            datesO[date] = true;
        });

        datesA = Object.keys(datesO).sort();

        Object.keys(groups).sort(function (a, b) {
            return a - b;
        }).forEach(function (a, i, aa) {
            var o, j = +aa[i - 1];
            if (i) {
                while (++j < +a) {
                    o = { condition: getCondition(j) };
                    datesA.forEach(function (d) { o[d] = 0; });
                    r.push(o);
                }
            }
            datesA.forEach(function (d) { groups[a][d] = groups[a][d] || 0; });
            groups[a].condition = getCondition(groups[a].condition, i === 0, i + 1 === aa.length);
            r.push(groups[a]);
        });
        return r;
    }(a);

console.log(result);

您可以创建带条件的数组,然后使用 forEach 并按 location_count 过滤并添加到数组中的每个对象。

let a = {
  "location": [{
    "data_time": "2016-06-23",
    "location_count": 5
  }, {
    "data_time": "2016-06-23",
    "location_count": 120
  }, {
    "data_time": "2016-06-24",
    "location_count": 7
  }, {
    "data_time": "2016-06-24",
    "location_count": 200
  }]
};

//Create result array with object-conditions
var result = [
  {condition: 'Below 10'}, 
  {condition: 'Between 10 and 100'}, 
  {condition: 'Greater than 100'}
];

//Add dates as properties to each object in result
a.location.forEach(function(e) {
  var date = e.data_time.replace(/-/g, '');
  result.forEach(function(o) {o[date] = 0})
})

//Filter by location_count and add to objects in result
a.location.forEach(function(e) {
  var date = e.data_time.replace(/-/g, '');
  
  if(e.location_count < 10) {
    result[0][date]++;
  } else if(e.location_count >= 10 && e.location_count < 100) {
    result[1][date]++;
  } else {
    result[2][date]++;
  }
})

console.log(result)