Я пытаюсь реализовать метод фильтра в массиве, в котором каждый элемент является следующим объектом:
{
"start": 1234,
"end": 4321,
"count": 0
}
Я хочу удалить дубликаты из моего массива, увеличивая свойство count
.
На данный момент мне удалось только фильтровать массив с помощью свойства start
с помощью этого кода:
var temp = {};
myArray = myArray.filter(function(obj) {
if (obj.start in temp) {
return false;
} else {
temp[obj.start] = true;
return true;
}
});
То, что я хочу достичь, это фильтр, который работает в этих условиях (для лучшего объяснения я буду ссылаться на элементы в temp
как tempObj
и текущий объект как obj
):
- if
obj.start
===tempObj.start
&&obj.end
===tempObj.end
,obj.count
+ = 1- если
obj.start
===tempObj.start
||obj.end
===tempObj.end
,obj.count
=tempObj.count
+ 1- if
obj.start
>tempObj.start
&&obj.end
<tempObj.end
,obj.count
=tempObj.count
+ 1- иначе добавьте новый элемент в
temp
сcount
= 1
Возможно ли использование метода фильтра? Если нет, то каков правильный путь? Я бы предпочел не использовать какие-либо рамки.
EDIT: согласно запросу RobG, чтобы сделать вопрос более понятным, я добавляю пример ввода и вывода.
Пример ввода:
myArray = [{
"start": 1105,
"end": 1501,
"count": 0
},
{
"start": 1105,
"end": 1003,
"count": 0
},
{
"start": 1110,
"end": 1120,
"count": 0
},
{
"start": 1105,
"end": 1003,
"count": 0
},
{
"start": 1115,
"end": 1120,
"count": 0
}]
Желаемый результат:
myArray = [{
"start": 1105,
"end": 1501,
"count": 1
},
{
"start": 1105,
"end": 1003,
"count": 3
},
{
"start": 1110,
"end": 1120,
"count": 1
}
{
"start": 1115,
"end": 1120,
"count": 1
}]
Это то, что вы ищите?
myArray = [{
"start": 1105,
"end": 1501,
"count": 0
},
{
"start": 1105,
"end": 1003,
"count": 0
},
{
"start": 1110,
"end": 1120,
"count": 0
},
{
"start": 1105,
"end": 1003,
"count": 0
},
{
"start": 1115,
"end": 1120,
"count": 0
}
]
var obj = {};
for (var i = 0, len = myArray.length; i < len; i++) {
obj[myArray[i]['start']] = myArray[i];
}
myArray = new Array();
var count = 0;
for (var key in obj) {
obj[key].count = count++;
myArray.push(obj[key]);
}
console.log(myArray)
обновленный ответ.
myArray = [{
"start": 1105,
"end": 1501,
"count": 0
},
{
"start": 1105,
"end": 1003,
"count": 0
},
{
"start": 1105,
"end": 1003,
"count": 0
},
{
"start": 1110,
"end": 1120,
"count": 0
},
{
"start": 1105,
"end": 1003,
"count": 0
},
{
"start": 1115,
"end": 1120,
"count": 0
}
]
function removeDoopCount(myArray) {
const start = x => myArray[x].start;
const end = x => myArray[x].end;
let hash = new Map();
for (var i = 0, len = myArray.length; i < len; i++) {
let key = start(i) + ':' + end(i);
let item = myArray[i];
let values = hash.get(key);
if (values) values.push(item);
else hash.set(key, [item]);
}
let ar = [];
hash.forEach((v, k, m) => (count = 1, v.forEach(i => i.count += count++), ar.push(v[v.length - 1])));
return ar;
}
console.log(removeDoopCount(myArray));