С помощью lodash вы можете группировать по комбинации значений foo
и baz
.Затем сопоставьте результат и выберите объект с наибольшим значением baz
в каждой группе:
var array = [
{ "foo": 1, "bar": 2, "baz": 3 },
{ "foo": 1, "bar": 2, "baz": 5 },
{ "foo": 1, "bar": 2, "baz": 4 },
{ "foo": 2, "bar": 1, "baz": 3 },
{ "foo": 2, "bar": 1, "baz": 7 },
{ "foo": 1, "bar": 3, "baz": 4 }
]
var result = _.map(
_.groupBy(array, o => `${o.foo}-${o.bar}`),
g => _.maxBy(g, 'baz')
)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
С помощью vanilla JS вы можете преобразовать массив в объект (аккумулятор), используя аналогичное соглашение для ключа аккумулятора (комбинация bar
и baz
).Всякий раз, когда объект из массива и объект, сохраненный в аккумуляторе, имеют один и тот же ключ, ключ с наибольшим значением baz
сохраняется.
const array = [
{ "foo": 1, "bar": 2, "baz": 3 },
{ "foo": 1, "bar": 2, "baz": 5 },
{ "foo": 1, "bar": 2, "baz": 4 },
{ "foo": 2, "bar": 1, "baz": 3 },
{ "foo": 2, "bar": 1, "baz": 7 },
{ "foo": 1, "bar": 3, "baz": 4 }
]
const result = Object.values(array.reduce((r, o) => {
const key = `${o.foo}-${o.bar}`
if(!r[key] || r[key].baz < o.baz) r[key] = o
return r
}, {}))
console.log(result)