我有以下数据:
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
字段的点数。因此,这应返回一个包含数据记录的新数据集,其中包含ID 1,2,3,6,7,8(前三个因为值为10,11,12,后三个因为值为21,22,23)Filter2
应仅向我提供date
字段中相差1天但具有相同value
字段的点数。因此,这应返回包含带有ids 1,4,5 我目前在服务器端的C#中这样做,但我想看看是否有一种有效的方法在Javascript中执行此操作。有什么建议吗?
答案 0 :(得分:5)
为什么,自定义排序功能,当然!
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;
}