您的位置:首页 > Web前端 > JavaScript

js 数组对象的求和、过滤、多重排序的方法封装

2018-01-13 16:26 627 查看
在做数据报表和后台管理系统开发的过程中,经常会遇到对拿到的数据再进行求和以及过滤的操作,其实实现它们并不难,只是多个页面都要进行这些操作的话,再一点一点的去写,好麻烦的。当一些代码重复率太高的时候,就要考虑优化了。封装成方法,在用的时候去调用,这才是正确的选择。

求和

// 第一个参数是要求和的数组对象,后面是要求和的字段(不定项),如果要求和的字段值是字符串也做了相应转换
function obj_sum(arr, ...param) {
var temp = {};
arr.forEach(function(item, index) {
for(var k in item) {
if(param.indexOf(k) >= 0) {
if((typeof item[k]) == 'string'){
item[k] = item[k]*1
}
if(temp[k]) {
temp[k] += item[k];
} else {
temp[k] = item[k];
}
}
}
});
return temp;
};
// 以下是测试数据
var arr = [
{
"adslot_id": 16,
"request": '1234567',
"served_request": 12345,
"impression": 1234,
"click": '234',
"income": 34,
"app_income": 30
},
{
"adslot_id": 17,
"request": '2345678',
"served_request": 23456,
"impression": 2345,
"click": 345,
"income": 45,
"app_income": 40
},
{
"adslot_id": 18,
"request": '3456789',
"served_request": 34567,
"impression": 4567,
"click": '567',
"income": 67,
"app_income": 60
}
];
// 以下就可得到相应一些字段的求和结果
console.log(obj_sum(arr,'request','served_request','click','app_income','income'));


过滤

// 第一个参数是要筛选的数据,第二个参数是筛选值,后面是筛选的字段
function obj_filter(data, v, ...k){
let key = (v || '').trim();
let keyLength = key.length;
let keyMatcher = new RegExp(key, 'i');
if(keyLength) {
data = data.filter(res =>{
let flag = false;
for(var item of k) {
flag = keyMatcher.test(res[item]);
if(flag) break;
}
return flag;
})
}
return data;
}
// 测试方法同上


多重排序(按照多个字段同时排序)

// 前两个参数是sort方法的两个参数,第三个参数可有可无,为排序属性,即要排序的字段和排序的方向;如果第三个字段为空,则按照全属性升序排序
function obj_sort(item1,item2) {
// "use strict";
var props = [];
for (var _i = 2; _i < arguments.length; _i++) {
props[_i - 2] = arguments[_i];
}
var cps = []; // 存储排序属性比较结果。
// 如果未指定排序属性,则按照全属性升序排序。
var asc = true;
if (props.length < 1) {
for (var p in item1) {
if (item1[p] > item2[p]) {
cps.push(1);
break; // 大于时跳出循环。
} else if (item1[p] ==
4000
= item2[p]) {
cps.push(0);
} else {
cps.push(-1);
break; // 小于时跳出循环。
}
}
}
else {
for (var i = 0; i < props.length; i++) {
var prop = props[i];
for (var o in prop) {
asc = prop[o] === "ascending" ? 1 : -1;
if (item1[o] > item2[o]) {
return asc;
} else if (item1[o] < item2[o]) {
return -asc;
}
}
}
return 0;
}
for (var j = 0; j < cps.length; j++) {
if (cps[j] === 1 || cps[j] === -1) {
return cps[j];
}
}

return false;
};
// 测试数据
var arr = [
{
"adslot_id": 16,
"request": '1234567',
"served_request": 12345,
"impression": 1234,
"click": '234',
"income": 50,
"app_income": 30
},
{
"adslot_id": 17,
"request": '1234567',
"served_request": 23456,
"impression": 2345,
"click": 345,
"income": 45,
"app_income": 40
},
{
"adslot_id": 18,
"request": '2456789',
"served_request": 34567,
"impression": 4567,
"click": '567',
"income": 50,
"app_income": 60
}
];
let obj ={ "request": 'ascending', "income": 'ascending'};
let obj1 ={ "request": 'ascending', "income": 'ascending', "app_income": 'descending'};
console.log(
arr.sort(function(a,b){
return obj_sort(a,b,obj)
})
)
console.log(
arr.sort(function(a,b){
return obj_sort(a,b,obj1)
})
)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息