var data = [
{
label: 'tagA',
value: 1
},
{
label: 'tagB',
value: 2
},
{
label: 'tagC',
value: 3
},
{
label: 'tagB',
value: 4
},
{
label: 'tagB',
value: 5
},
];
From Above Array Я хочу получить уникальный элемент на основе id и max value, используя lodash
Вот решение lodash, которое использует lodash#orderBy
и lodash#uniqBy
.
var result = _(data)
.orderBy(['label', 'value'], ['asc', 'desc'])
.uniqBy('label')
.value();
var data = [
{
label: 'tagA',
value: 1
},
{
label: 'tagB',
value: 2
},
{
label: 'tagC',
value: 3
},
{
label: 'tagB',
value: 4
},
{
label: 'tagB',
value: 5
},
];
var result = _(data)
.orderBy(['label', 'value'], ['asc', 'desc'])
.uniqBy('label')
.value();
console.log(result);
.as-console-wrapper{min-height:100%;top: 0}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
Решение ES5 с использованием массива # уменьшает:
var data = [{"label":"tagA","value":1},{"label":"tagB","value":2},{"label":"tagC","value":3},{"label":"tagB","value":4},{"label":"tagB","value":5}];
var helper = {};
var result = data.reduce(function(r, o) {
if(!helper[o.label]) {
r.push((helper[o.label] = Object.assign(o)));
} else {
o.value > helper[o.label].value && (helper[o.label].value = o.value);
}
return r;
}, []);
console.log(result);
Решение ES6 с использованием массива Array # уменьшает и Map, чтобы собирать уникальные значения, а затем использовать значения Map # и распространять синтаксис для получения массива:
const data = [{"label":"tagA","value":1},{"label":"tagB","value":2},{"label":"tagC","value":3},{"label":"tagB","value":4},{"label":"tagB","value":5}];
const result = [...data.reduce((map, o) =>
map.has(o.label) && map.get(o.label).value > o.value ?
map : map.set(o.label, o), new Map).values()];
console.log(result);