Объединять только повторяющиеся повторяющиеся объекты - PullRequest
0 голосов
/ 04 июня 2018

Учитывая массив как

[
    {name: 'John', span: 1},
    {name: 'John', span: 1},
    {name: 'Peter', span: 1},
    {name: 'John', span: 1},
    {name: 'Peter', span: 1},
    {name: 'Peter', span: 1},
    {name: 'Peter', span: 1}
]

Я хотел бы объединить его таким образом, чтобы, если они повторяются, мы объединяли и суммировали свойство span.Таким образом, ожидаемый результат составляет

[
    {name: 'John', span: 2},
    {name: 'Peter', span: 1},
    {name: 'John', span: 1},
    {name: 'Peter', span: 3}
]

Кто-нибудь может предложить подходящий способ сделать это?Лучшее, что я мог придумать, было

var data = [
    {name: 'John', span: 1},
    {name: 'John', span: 1},
    {name: 'Peter', span: 1},
    {name: 'John', span: 1},
    {name: 'Peter', span: 1},
    {name: 'Peter', span: 1},
    {name: 'Peter', span: 1}
];
var result = [];

var count = 0;
while (count <= data.length) {
    var datum = data[count];
    var isFound = false;

    do {
        var nextCount = data[++count];

        if (!nextCount) {
            break;
        }

        if (nextCount.name === datum.name) {
            datum.span += 1;
            isFound = true;
        } else {
            isFound = false;
        }
    } while(isFound);   

    result.push(datum);
}

console.log(result);

. Это работает, за исключением undefined, который находится в конце (не знаю почему).Кто-нибудь может предложить более эффективный и читабельный способ сделать это?

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Это может быть решением

const arr = [
  {name: 'John', span: 1},
  {name: 'John', span: 1},
  {name: 'Peter', span: 1},
  {name: 'John', span: 1},
  {name: 'Peter', span: 1},
  {name: 'Peter', span: 1},
  {name: 'Peter', span: 1}
]

const parsed = arr.reduce((acc, item) => {
  if(acc[acc.length - 1] && acc[acc.length - 1].name == item.name) {
    acc[acc.length - 1].span++
  } else {
    acc.push(item)
  }
  return acc
}, [])

console.log(parsed)
0 голосов
/ 04 июня 2018

Вы можете фильтровать и обновлять объект при проверке последнего объекта.

Это решение изменяет исходный массив.

var array = [{ name: 'John', span: 1 }, { name: 'John', span: 1 }, { name: 'Peter', span: 1 }, { name: 'John', span: 1 }, { name: 'Peter', span: 1 }, { name: 'Peter', span: 1 }, { name: 'Peter', span: 1 }],
    result = array.filter((last => o => {
        if (!last || last.name !== o.name) {
            last = o;
            return true;
        }
        last.span += o.span;
    })());

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 04 июня 2018

Примерно так:

var data = [
    {name: 'John', span: 1},
    {name: 'John', span: 1},
    {name: 'Peter', span: 1},
    {name: 'John', span: 1},
    {name: 'Peter', span: 1},
    {name: 'Peter', span: 1},
    {name: 'Peter', span: 1}
];

function groupSpans(data) {
    const result = [];
    let current;
    let currentKey;
    data.forEach((datum) => {
        if(datum.name !== currentKey) {
            currentKey = datum.name;
            current = {... datum};
            result.push(current);
            return;
        }
        current.span++;
    });
    return result;
}

console.log(groupSpans(data));

->

~/Desktop $ node so50677991.js
[ { name: 'John', span: 2 },
  { name: 'Peter', span: 1 },
  { name: 'John', span: 1 },
  { name: 'Peter', span: 3 } ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...