Случай 1:
function example1(initData, fieldsArr){
const output = data.reduce((aggObj, item) => {
const stringId = fieldsArr.map(key => item[key]).join('_');
if (aggObj[stringId]){
aggObj[stringId].push(item);
}
else {
aggObj[stringId] = [item];
}
return aggObj;
}, {})
const outputNoDups = Object.values(output).map(group => {
const sorted = group.sort((a,b) => new Date(a.transaction) < new Date(b.transaction) ? -1 : 1);
return sorted.filter((a, i) => {
if (i == 0) return true;
if (a.amount == sorted[i - 1].amount &&
new Date(a.transaction) - new Date(sorted[i - 1].transaction) <= 45000){
return true;
}
return false;
});
});
return outputNoDups.filter(a => a.length > 1);
}
console.log(example1(data, ['manufacturer', 'category']));
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script id="initData">
const data = [{
id: 3,
manufacturer: 'audi',
amount: 40,
category: 'leasing',
transaction: '2020-03-02T10:34:30.000Z'
},
{
id: 4,
manufacturer: 'audi',
amount: 40,
category: 'leasing',
transaction: '2020-03-02T10:34:38.000Z'
},
{
id: 1,
manufacturer: 'mercedes',
amount: 20,
category: 'leasing',
transaction: '2020-03-05T12:00:00.000Z'
},
{
id: 7,
manufacturer: 'audi',
amount: 40,
category: 'leasing',
transaction: '2020-03-20T11:00:00.000Z'
},
{
id: 6,
manufacturer: 'mercedes',
amount: 20,
category: 'leasing',
transaction: '2020-03-05T12:00:44.000Z'
},
{
id: 2,
manufacturer: 'volkswagen',
amount: 2,
category: 'credit',
transaction: '2020-03-05T12:00:45.000Z'
},
{
id: 5,
manufacturer: 'audi',
amount: 40,
category: 'leasing',
transaction: '2020-03-02T10:35:17.000Z'
},
];
</script>
ВЫХОД (Случай 1):
[
[
{
"id": 3,
"manufacturer": "audi",
"amount": 40,
"category": "leasing",
"transaction": "2020-03-02T10:34:30.000Z"
},
{
"id": 4,
"manufacturer": "audi",
"amount": 40,
"category": "leasing",
"transaction": "2020-03-02T10:34:38.000Z"
},
{
"id": 5,
"manufacturer": "audi",
"amount": 40,
"category": "leasing",
"transaction": "2020-03-02T10:35:17.000Z"
}
],
[
{
"id": 1,
"manufacturer": "mercedes",
"amount": 20,
"category": "leasing",
"transaction": "2020-03-05T12:00:00.000Z"
},
{
"id": 6,
"manufacturer": "mercedes",
"amount": 20,
"category": "leasing",
"transaction": "2020-03-05T12:00:44.000Z"
}
]
]
Случай 2:
function example1(initData, fieldsArr){
const output = data.reduce((aggObj, item) => {
const stringId = fieldsArr.map(key => item[key]).join('_');
if (aggObj[stringId]){
aggObj[stringId].push(item);
}
else {
aggObj[stringId] = [item];
}
return aggObj;
}, {})
const outputNoDups = Object.values(output).map(group => {
const sorted = group.sort((a,b) => new Date(a.transaction) < new Date(b.transaction) ? -1 : 1);
return sorted.filter((a, i) => {
if (i == 0) return true;
if (a.amount == sorted[i - 1].amount &&
new Date(a.transaction) - new Date(sorted[i - 1].transaction) <= 45000){
return true;
}
return false;
});
});
return outputNoDups.filter(a => a.length > 1);
}
console.log(example1(data, ['manufacturer', 'category']));
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script id="initData">
const data = [{
id: 2,
manufacturer: 'audi',
amount: 40,
category: 'leasing',
transaction: '2020-03-02T10:34:30.000Z'
},
{
id: 7,
manufacturer: 'audi',
amount: 40,
category: 'leasing',
transaction: '2020-03-20T11:00:00.000Z'
}]
</script>
Случай 3:
function example1(initData, fieldsArr){
const output = data.reduce((aggObj, item) => {
const stringId = fieldsArr.map(key => item[key]).join('_');
if (aggObj[stringId]){
aggObj[stringId].push(item);
}
else {
aggObj[stringId] = [item];
}
return aggObj;
}, {})
const outputNoDups = Object.values(output).map(group => {
const sorted = group.sort((a,b) => new Date(a.transaction) < new Date(b.transaction) ? -1 : 1);
return sorted.filter((a, i) => {
if (i == 0) return true;
if (a.amount == sorted[i - 1].amount &&
new Date(a.transaction) - new Date(sorted[i - 1].transaction) <= 45000){
return true;
}
return false;
});
});
return outputNoDups.filter(a => a.length > 1);
}
console.log(example1(data, ['manufacturer', 'category']));
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script id="initData">
const data = [{
id: 2,
manufacturer: 'audi',
amount: 40,
category: 'leasing',
transaction: '2020-03-02T10:34:30.000Z'
},
{
id: 1,
manufacturer: 'audi',
amount: 40,
category: 'credit',
transaction: '2020-03-02T10:34:40.000Z'
}]
</script>
Случай 4 (крайний случай, который вы не рассматривали - время меньше 45, но количество другое):
function example1(initData, fieldsArr){
const output = data.reduce((aggObj, item) => {
const stringId = fieldsArr.map(key => item[key]).join('_');
if (aggObj[stringId]){
aggObj[stringId].push(item);
}
else {
aggObj[stringId] = [item];
}
return aggObj;
}, {})
const outputNoDups = Object.values(output).map(group => {
const sorted = group.sort((a,b) => new Date(a.transaction) < new Date(b.transaction) ? -1 : 1);
return sorted.filter((a, i) => {
if (i == 0) return true;
if (a.amount == sorted[i - 1].amount &&
new Date(a.transaction) - new Date(sorted[i - 1].transaction) <= 45000){
return true;
}
return false;
});
});
return outputNoDups.filter(a => a.length > 1);
}
console.log(example1(data, ['manufacturer', 'category']));
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script id="initData">
const data = [{
id: 2,
manufacturer: 'audi',
amount: 40,
category: 'leasing',
transaction: '2020-03-02T10:34:30.000Z'
},
{
id: 1,
manufacturer: 'audi',
amount: 30,
category: 'leasing',
transaction: '2020-03-02T10:34:40.000Z'
}]
</script>