Нужно отформатировать массив объектов другим способом - PullRequest
0 голосов
/ 20 января 2019

У меня есть матричный ответный массив:

matrixArray = [
                {Responded: 1, RowName: row1, ColName: col1},
                {Responded: 2, RowName: row1, ColName: col2},
                {Responded: 0, RowName: row1, ColName: col3},
                {Responded: 0, RowName: row2, ColName: col1},
                {Responded: 0, RowName: row2, ColName: col2},
                {Responded: 1, RowName: row2, ColName: col3},
                {Responded: 1, RowName: row3, ColName: col1},
                {Responded: 0, RowName: row3, ColName: col2},
                {Responded: 1, RowName: row3, ColName: col3},
                ...
                ...
              ];

Это говорит о том, сколько раз столбец отвечал за строку. Мне нужен вышеуказанный массив объектов в следующем формате:

matrixArray = [
                {
                  RowName: row1,
                  col1: 1,           //Here '1' is no. of times column responded
                  col2: 2,
                  col3: 0
                },
                {
                  RowName: row2,
                  col1: 0,
                  col2: 0,
                  col3: 1
                },
                {
                  RowName: row3,
                  col1: 1,
                  col2: 0,
                  col3: 1
                },
              ];

Я использую TypeScript для этого. Спасибо.

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Вы можете использовать reduce и Object.values следующим образом:

const matrixArray = [{Responded:1,RowName:'row1',ColName:'col1'},{Responded:2,RowName:'row1',ColName:'col2'},{Responded:0,RowName:'row1',ColName:'col3'},{Responded:0,RowName:'row2',ColName:'col1'},{Responded:0,RowName:'row2',ColName:'col2'},{Responded:1,RowName:'row2',ColName:'col3'},{Responded:1,RowName:'row3',ColName:'col1'},{Responded:0,RowName:'row3',ColName:'col2'},{Responded:1,RowName:'row3',ColName:'col3'}]

const merged = matrixArray.reduce((acc, {Responded,RowName,ColName}) => {
       acc[RowName] = acc[RowName] || {RowName};
       acc[RowName][ColName] = (acc[RowName][ColName] + Responded) || Responded;
       return acc;
   }, {});

const output = Object.values(merged);
console.log(output)

Вот более короткая версия приведенного выше кода:

const matrix = [{Responded:1,RowName:'row1',ColName:'col1'},{Responded:2,RowName:'row1',ColName:'col2'},{Responded:0,RowName:'row1',ColName:'col3'},{Responded:0,RowName:'row2',ColName:'col1'},{Responded:0,RowName:'row2',ColName:'col2'},{Responded:1,RowName:'row2',ColName:'col3'},{Responded:1,RowName:'row3',ColName:'col1'},{Responded:0,RowName:'row3',ColName:'col2'},{Responded:1,RowName:'row3',ColName:'col3'}],
  
output = Object.values(matrix.reduce((a, {Responded,RowName,ColName}) => (
    (a[RowName] = a[RowName] || {RowName})[ColName] = Responded, a), {}));

console.log(output);
0 голосов
/ 20 января 2019

Вы можете использовать Array.reduce и Object.values для получения желаемого результата:

const matrixArray = [
  {Responded: 1, RowName: 'row1', ColName: 'col1'},
  {Responded: 2, RowName: 'row1', ColName: 'col2'},
  {Responded: 0, RowName: 'row1', ColName: 'col3'},
  {Responded: 0, RowName: 'row2', ColName: 'col1'},
  {Responded: 0, RowName: 'row2', ColName: 'col2'},
  {Responded: 1, RowName: 'row2', ColName: 'col3'},
  {Responded: 1, RowName: 'row3', ColName: 'col1'},
  {Responded: 0, RowName: 'row3', ColName: 'col2'},
  {Responded: 1, RowName: 'row3', ColName: 'col3'}
];

const result = Object.values(matrixArray.reduce((result, entry) => {
  if (!(entry.RowName in result)) {
    result[entry.RowName] = {RowName: entry.RowName};
  }
  if (!(entry.ColName in result[entry.RowName])) {
    result[entry.RowName][entry.ColName] = 0;
  }
  result[entry.RowName][entry.ColName] += entry.Responded;
  return result;
}, {}));

console.log(result);

Обратите внимание, что я не набрал здесь переменные, чтобы сделать их работоспособными, не стесняйтесь делать это, поскольку вы используете Typescript.

Объяснение:

  • Array.reduce зацикливается на массиве и создает карту * (1020 * (объект), увеличивая ее на соответствующую сумму Responded на каждой итерации),
  • Object.values затемпревращает это обратно в массив.
...