【发布时间】:2019-04-14 15:37:42
【问题描述】:
我收到了一个挑战并且已经完成了,但我认为这不是一个好方法。 我认为有一个简短的方法可以做同样的事情。
我在寻找 MAP、REDUCE 和 FILTERS,但没有找到好的方法。
目标是:
- 查找重复交易。
- 相似的分组
- 对结果进行排序
说明: 有时,当向客户收费时,会创建重复的交易。我们需要找到这些交易,以便处理它们。交易的所有内容都应该是相同的,除了交易 ID 和它发生的时间,因为可能会有一分钟的延迟。
findDuplicateTransactions(事务)
查找所有具有相同sourceAccount、targetAccount、category、amount,且每次连续交易时间差小于1分钟的交易。
输入 您可以假设所有参数将始终存在且有效。但是,不能保证传入的交易按任何特定的顺序排列。
交易列表 (Transaction[]) 输出 所有重复事务组的列表,按时间升序排序 (Transaction[][]) 组应按组中第一个事务的升序排序。 例子 输入:
[
{
id: 3,
sourceAccount: 'A',
targetAccount: 'B',
amount: 100,
category: 'eating_out',
time: '2018-03-02T10:34:30.000Z'
},
{
id: 1,
sourceAccount: 'A',
targetAccount: 'B',
amount: 100,
category: 'eating_out',
time: '2018-03-02T10:33:00.000Z'
},
{
id: 6,
sourceAccount: 'A',
targetAccount: 'C',
amount: 250,
category: 'other',
time: '2018-03-02T10:33:05.000Z'
},
{
id: 4,
sourceAccount: 'A',
targetAccount: 'B',
amount: 100,
category: 'eating_out',
time: '2018-03-02T10:36:00.000Z'
},
{
id: 2,
sourceAccount: 'A',
targetAccount: 'B',
amount: 100,
category: 'eating_out',
time: '2018-03-02T10:33:50.000Z'
},
{
id: 5,
sourceAccount: 'A',
targetAccount: 'C',
amount: 250,
category: 'other',
time: '2018-03-02T10:33:00.000Z'
}
];
预期输出:
[
[
{
id: 1,
sourceAccount: "A",
targetAccount: "B",
amount: 100,
category: "eating_out",
time: "2018-03-02T10:33:00.000Z"
},
{
id: 2,
sourceAccount: "A",
targetAccount: "B",
amount: 100,
category: "eating_out",
time: "2018-03-02T10:33:50.000Z"
},
{
id: 3,
sourceAccount: "A",
targetAccount: "B",
amount: 100,
category: "eating_out",
time: "2018-03-02T10:34:30.000Z"
}
],
[
{
id: 5,
sourceAccount: "A",
targetAccount: "C",
amount: 250,
category: "other",
time: "2018-03-02T10:33:00.000Z"
},
{
id: 6,
sourceAccount: "A",
targetAccount: "C",
amount: 250,
category: "other",
time: "2018-03-02T10:33:05.000Z"
}
]
];
这是我的代码,但我不喜欢它。有什么好办法吗?
function findDuplicateTransactions (transactions = []) {
var result = [];
console.info("total itens :" + transactions.length);
//sort
transactions = transactions.sort((a,b)=> a.time.localeCompare(b.time))
//remove itens not duplicated
result = removeItens(transactions);
//group
result = groupBy(result, function(item){
return [item.sourceAccount, item.targetAccount, item.amount, item.category];
});
console.info(result);
//remove UniqueElements
result = removeUniqueElements(result);
return result;
}
function removeUniqueElements(array){
var filtered = array.filter(function(value, index, arr){
return value.length >= 2;
});
return filtered;
}
function removeItens(array){
var itensToBeRemoved = [];
for (var index = 0; index < array.length; index++) {
const element1 = array[index];
var cont = 0;
console.info("============== looking for: " + element1.id);
for (var index2 = 0; index2 < array.length; index2++) {
const element2 = array[index2];
if(element1.id != element2.id){
var date1 = new Date(element1.time);
var date2 = new Date(element2.time);
var timeDiff = Math.abs(date2.getTime() - date1.getTime());
console.info("comparing :" + element1.id + "<->" + element2.id + " diff: " + timeDiff);
if( timeDiff < 60000) {
//keep it - is similar
console.info("find one duplicated: " + element2.id);
break;
}else{
cont++;
}
}
}
//console.info("cont: " + cont)
if(cont == array.length-1){
//array.splice(index, 1);
console.info("possible duplicated: " + element1.id);
itensToBeRemoved.push(element1.id);
}
}
var filtered = [];
for(var i=0; i<itensToBeRemoved.length; i++){
console.info("remove item: " + itensToBeRemoved[i]);
array = arrayRemove(array, itensToBeRemoved[i]);
}
return array;
}
function arrayRemove(arr, value) {
return arr.filter(function(ele){
console.info("watching: " + ele.id);
console.info("index: " + value);
return ele.id != value;
});
}
function groupBy( array , f ){
var lists = {};
array.forEach( function( o ){
var list = JSON.stringify( f(o) );
lists[list] = lists[list] || [];
lists[list].push( o );
});
return Object.keys(lists).map( function( list ){
return lists[list];
})
}
【问题讨论】:
-
对象根据哪个键分组。还有为什么带有
id:4的obj 不是结果? -
哦,这里没有列出一些规则......对不起。我会完成问题
-
为什么
id: 3在里面? -
@NinaScholz,id:3 与 id:2 相似(不到 1 分钟)
标签: javascript arrays object