我有如下数据:
var data = [{
id: 1,
date: new Date("2010-01-01"),
value: 10
}, {
id: 2,
date: new Date("2010-01-01"),
value: 11
}, {
id: 3,
date: new Date("2010-01-01"),
value: 12
}, {
id: 4,
date: new Date("2010-01-02"),
value: 10
}, {
id: 5,
date: new Date("2010-01-03"),
value: 10
}, {
id: 6,
date: new Date("2010-01-03"),
value: 21
}, {
id: 7,
date: new Date("2010-01-03"),
value: 22
}, {
id: 8,
date: new Date("2010-01-03"),
value: 23
}];
我正在尝试应用两种过滤器:
-
Filter1
应该只给我那些在value
中相差 1 的点字段但具有相同的date
field 。因此,这应该返回一个新的数据集,其中包含 id 为 1,2,3,6,7,8 的数据记录(前三个因为值为 10,11,12,后三个因为值为 21,22,23)< -
Filter2
应该只给我那些在date
中相差 1 天的点字段但具有相同的value
field 。因此,这应该返回一个新的数据集,其中包含 ID 为 1,4,5 的数据记录
我目前正在服务器端使用 C# 执行此操作,但我想看看是否有一种有效的方法可以在 Javascript 中执行此操作。有什么建议吗?
最佳答案
为什么,当然是自定义排序函数!
function filter1(arr) {
// Clone the array:
arr = arr.slice();
// Sort the array by value:
arr.sort(function(a, b) {
return a.date - b.date || a.value - b.value;
});
// Look for consecutive elements with the same date:
var r = [];
for(var i = 1; i < arr.length; i++) {
if(+arr[i - 1].date === +arr[i].date && arr[i - 1].value === arr[i].value - 1) {
if(r.indexOf(arr[i - 1]) === -1) r.push(arr[i - 1]);
r.push(arr[i]);
}
}
// Return the result
return r;
}
function filter2(arr) {
// Clone the array:
arr = arr.slice();
// Sort the array by date:
arr.sort(function(a, b) {
return a.value - b.value || a.date - b.date;
});
// Look for consecutive elements with the same value:
var r = [];
for(var i = 1; i < arr.length; i++) {
if(arr[i - 1].value === arr[i].value && arr[i].date - arr[i - 1].date <= 24 * 60 * 60 * 1000) {
if(r.indexOf(arr[i - 1]) === -1) r.push(arr[i - 1]);
r.push(arr[i]);
}
}
// Return the result
return r;
}
关于javascript - 实现这种过滤的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11130478/