@khiukv
Учусь на веб разработчика

Как оставить в массиве объектов только элементы с не уникальным значением конкретного свойства?

Как оставить в массиве объектов только элементы с не уникальным значением конкретного свойства?

Например, такой массив:

objectsArray = [
  {
    props1: '123',
    props2: 'string1'
  },
  {
    props1: '123',
    props2: 'string2'
  },
  {
    props1: '123654',
    props2: 'string3'
  },
  {
    props1: '123',
    props2: 'string4'
  },
]

Нужно оставить в массиве только объекты, у которых свойство props1 не уникально, в данном случае это значение 123.
  • Вопрос задан
  • 223 просмотра
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Вспомогательная функция, ниже понадобится:

function getFilterByCount(arr, filterFn, key) {
  const getKey = key instanceof Function ? key : key == null ? n => n : n => n[key];
  const count = arr.reduce((acc, n) => acc.set(getKey(n), -~acc.get(getKey(n))), new Map);
  return n => !!filterFn(count.get(getKey(n)));
}

Собираем новый массив:

const filterByCount = (...args) => args[0].filter(getFilterByCount(...args));


const newArr = filterByCount(arr, count => count > 1, 'props1');

Удаляем из существующего:

function deleteByCount(arr, filterFn, key) {
  let numDeleted = 0;

  arr.forEach(function(n, i, a) {
    a[i - numDeleted] = n;
    numDeleted += this(n);
  }, getFilterByCount(arr, filterFn, key));

  arr.length -= numDeleted;
}


deleteByCount(arr, count => count < 2, n => n.props1);
Ответ написан
@WAR_VIK
let res = [];
for(let ob of objectsArray) {
   let count = 0;
   for(let ob2 of objectsArray) if(ob.props1 == ob2.props1) ++count;
   if(count > 1) res.push(ob);
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@defriz
люблю js
for (i in objectsArray) {
	if((objectsArray[i]) && (objectsArray[i - 1])) {
		if(objectsArray[i].props1 != objectsArray[i - 1].props1) {
			objectsArray.splice(i, 1);
		};
	};
};
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы