Вспомогательная функция, ниже понадобится:
function getFilterByCount(arr, filterFn, key = n => n) {
const getKey = key instanceof Function ? key : n => n[key];
const count = arr.reduce((acc, n) => {
const k = getKey(n);
return acc.set(k, -~acc.get(k));
}, 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) {
const f = getFilterByCount(arr, filterFn, key);
arr.length -= arr.reduce((acc, n, i, a) => (
a[i - acc] = n,
acc + f(n)
), 0);
}
deleteByCount(arr, count => count < 2, n => n.props1);