Как мне фильтровать и считать объекты в массиве javascript?

1

Я пытаюсь реализовать метод фильтра в массиве, в котором каждый элемент является следующим объектом:

{
  "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
}]
Теги:
arrays

1 ответ

0
Лучший ответ

Это то, что вы ищите?

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));
  • 0
    Нет, я ищу способ проверить условия как для начальных, так и для конечных свойств и, если они выполнены, увеличить счетчик.
  • 0
    @elegali обновленный ответ
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню