Получить дубликаты в объекте и объединить значение

1

У меня довольно простой вопрос, который я просто не могу понять.

Я хочу объединить все дублированные объекты и следить за количеством дубликатов, которые у меня есть.

Вот мой ввод:

[
  { 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() работает, чтобы удалить дубликаты, но я не могу их отслеживать.

Большое спасибо за любую помощь.

Теги:
underscore.js

5 ответов

1
Лучший ответ

Вы можете связать методы подчеркивания и группировать элементы по 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>
  • 0
    Спасибо за быстрый ответ, это именно то, что мне нужно <3
0

Вот еще один _.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>
0

Вы должны использовать метод 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 - ему не нужно использовать функции подчеркивания.

0

Вот решение 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);
0

Вы можете сопоставить и уменьшить это, чтобы получить данные, которые вы ищете:

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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню