如何使用 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
}]
一个简单的提议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)
这是我的数据:
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
}]
一个简单的提议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)