У меня довольно простой вопрос, который я просто не могу понять.
Я хочу объединить все дублированные объекты и следить за количеством дубликатов, которые у меня есть.
Вот мой ввод:
[
{ w: 'abc', c: 1 },
{ w: 'abc', c: 1 },
{ w: 'abc', c: 1 },
{ w: 'a', c: 1 },
{ w: 'a', c: 1 },
{ w: 'b', c: 1 },
{ w: 'c', c: 1 }
]
Здесь вывод, который я хотел бы иметь,
[
{ w: 'abc', c: 3 },
{ w: 'a', c: 2 },
{ w: 'b', c: 1 },
{ w: 'c', c: 1 }
]
_.union()
работает, чтобы удалить дубликаты, но я не могу их отслеживать.
Большое спасибо за любую помощь.
Вы можете связать методы подчеркивания и группировать элементы по w
а затем сопоставить новый объект с суммой желаемых значений.
var data = [{ w: 'abc', c: 1 }, { w: 'abc', c: 1 }, { w: 'abc', c: 1 }, { w: 'a', c: 1 }, { w: 'a', c: 1 }, { w: 'b', c: 1 }, { w: 'c', c: 1 }],
result = _
.chain(data)
.groupBy('w')
.map((array, w) => ({ w, c: _.reduce(array, (s, { c }) => s + c, 0) }))
.value();
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
Вот еще один _.countBy()
с использованием _.countBy()
и _.map
:
var data = [ { w: 'abc', c: 1 },
{ w: 'abc', c: 1 },
{ w: 'abc', c: 1 },
{ w: 'a', c: 1 },
{ w: 'a', c: 1 },
{ w: 'b', c: 1 },
{ w: 'c', c: 1 }]
var result = _
.chain(data)
.countBy('w')
.map(function(v, k) {
return { w: k, c: v }
})
.value();
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>
Вы должны использовать метод Array.protoype.reduce
. Вы можете передать пустой литерал объекта в качестве второго параметра и добавить к нему ключи на основе свойства w
каждого элемента массива. Для каждого элемента массива убедитесь, что ключ уже существует - если он этого не делает, установите count в 1 - если он это сделал, увеличьте счет на 1:
var a = [{
w: 'abc',
c: 1
},
{
w: 'abc',
c: 1
},
{
w: 'abc',
c: 1
},
{
w: 'a',
c: 1
},
{
w: 'a',
c: 1
},
{
w: 'b',
c: 1
},
{
w: 'c',
c: 1
}
];
var b = a.reduce((accum, el) => {
if (accum[el.w]) {
accum[el.w] = accum[el.w] + 1;
} else {
accum[el.w] = 1;
}
return accum;
}, {});
console.log(b);
Это стандартное решение для JavaScript - ему не нужно использовать функции подчеркивания.
Вот решение O(n)
для этого результата, используя простой JavaScript.
var arr = [ { w: 'abc', c: 1 },
{ w: 'abc', c: 1 },
{ w: 'abc', c: 1 },
{ w: 'a', c: 1 },
{ w: 'a', c: 1 },
{ w: 'b', c: 1 },
{ w: 'c', c: 1 }];
var tempObj = {};
arr.forEach((obj)=>{
if(tempObj[obj.w]){
tempObj[obj.w].c += obj.c
} else {
tempObj[obj.w] = {
w: obj.w,
c : obj.c
}
}
});
var resArray = Object.values(tempObj);
console.log(resArray);
Вы можете сопоставить и уменьшить это, чтобы получить данные, которые вы ищете:
const data = [ { w: 'abc', c: 1 },
{ w: 'abc', c: 1 },
{ w: 'abc', c: 1 },
{ w: 'a', c: 1 },
{ w: 'a', c: 1 },
{ w: 'b', c: 1 },
{ w: 'c', c: 1 }]
const output = data
.map(item => item.w)
.reduce((prev, curr) => ({
...prev,
[curr]: (prev[curr] || 0) + 1
}), {})
const correctFormat = Object.keys(output)
.map(key => ({
w: key,
c: output[key]
}))
console.dir(correctFormat)