Преобразовать объектный массив в массив с вычислением - PullRequest
0 голосов
/ 01 февраля 2019

Я работаю со следующим массивом объектов и пытаюсь преобразовать его в массив:

const data = [
  {
    count: 3,
    userName: "Paul Crewe",
    value: "Activity Type",
  },
  {
    count: 1,
    userName: "Nate Scarborough",
    value: "Activity Type",
  },
  {
    count: 1,
    userName: "Nate Scarborough",
    value: "Another Activity Type",
  },
  {
    count: 1,
    userName: "Paul Crewe",
    value: "Another Activity Type",
  },
];

Ожидаемый результат:

const outcome = [
  ['userName', 'Paul Crewe', 'Nate Scarborough'],
  ['Activity Type', 3, 1],
  ['Another Activity Type', 1, 1]
];

Массив результатов принимает данные и используетuserName ключ для создания первого элемента массива с последующим форматом value, count для каждого дополнительного элемента массива.Например,

['userName', 'Paul Crewe', 'Nate Scarborough'],
[{value}, {count for Paul Crewe}, {count for Nate Scarborough} ],

Я считаю, что использование reduce целесообразно и началось с:

data.reduce((a, c) => {
  a[c.userName] = { value: c.value, count: c.count };
  a[c.userName].count += c.count;
  return a;
}, {});

Но это приводит к нежелательному результату, например:

{
  Nate Scarborough: {value: "Another Activity Type", count: 2},
  Paul Crewe: {value: "Another Activity Type", count: 2},
}

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Я немного староват, когда дело доходит до работы с массивами - мне удобнее делать свои собственные циклы, чем различные «причудливые» методы массива.

Вот как бы я справился с этим,

const data = [
      {
        count: 3,
        userName: "Paul Crewe",
        value: "Activity Type",
      },
      {
        count: 1,
        userName: "Nate Scarborough",
        value: "Activity Type",
      },
      {
        count: 1,
        userName: "Nate Scarborough",
        value: "Another Activity Type",
      },
      {
        count: 1,
        userName: "Paul Crewe",
        value: "Another Activity Type",
      },
    ];
    
    const temp = {
      userName : []
    };
    
    data.forEach(function(e) {
      // push username only if not in array already
      if(temp.userName.indexOf(e.userName) === -1) {
        temp.userName.push(e.userName);
      }
      // create empty array for activity name, if not exists yet
      if(!temp[e.value]) {
        temp[e.value] = [];
      }
      temp[e.value].push(e.count)
    });
    
    var outcome = [];
    // special treatment for userName, to make sure that comes first
    temp.userName.unshift('userName');
    outcome.push(temp.userName);
    
    for(k in temp) {
      if(k != 'userName') {
        temp[k].unshift(k); // insert activity name at front of array
        outcome.push( temp[k]); // insert array into final result array
      }
    }
    console.log(outcome)

Использование вспомогательного объекта temp облегчает доступ к правильному массиву с использованием имени действия - если бы я использовал нужную структуру напрямую, это означало бы циклическое выполнение помассивов и все время сравнивая первую запись, чтобы найти нужную, тогда как для объекта подойдет простой поиск свойства.

0 голосов
/ 01 февраля 2019

Вы можете начать с ключа userName и построить новые строки значений, как требуется.Он работает с произвольным числом значений.

Это решение может вернуть массив разреженных массивов.Если не требуется, то вам нужно сопоставить внутренний массив с нулем по умолчанию.

const
    data = [{ count: 3, userName: "Paul Crewe", value: "Activity Type" }, { count: 1, userName: "Nate Scarborough", value: "Activity Type" }, { count: 1, userName: "Nate Scarborough", value: "Another Activity Type" }, { count: 1, userName: "Paul Crewe", value: "Another Activity Type" }],
    result = data.reduce((r, o) => {
        var vIndex = r.findIndex(([v]) => v === o.value),
            index = r[0].indexOf(o[r[0][0]]);

        if (vIndex < 0) {
            vIndex += r.push([o.value]);
        }            
        if (index < 0) {
            index += r[0].push(o[r[0][0]]);             
        }
        r[vIndex][index] = (r[vIndex][index] || 0) + o.count;
        return r;
    }, [['userName']]);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...