Loda sh создать объект из массива массивов - PullRequest
0 голосов
/ 29 мая 2020

Я хотел бы использовать loda sh для генерации объекта из массива массивов. Я использую для этого метод и карту loda sh .zipObject. Но это не 1: 1 то, что я хотел бы сгенерировать:

Вход:

 "rows": [
    [
      "stravi/aa",
      "202001",
      "59",
      "51",
      "2558.98",
      "0.5358894453719162",
      "1.9204668112983725",
      "140",
      "2.3466309084813943"
    ],
    [
      "stravi/ab",
      "202003",
      "3591",
      "349",
      "2246.09",
      "0.41838214",
      "3.57603358",
      "50",
      "4.82115474"
    ],
    [
      "stravi/ac",
      "202007",
      "3354",
      "25",
      "1975.76",
      "0.74220667708",
      "1.12321555541",
      "11",
      "0.9324532454"
    ]
  ]

dictionary: ['source', 'sessions', 'adClicks', 'adCost', 'CPC', 'CTR', 'goalCompletionsAll', 'goalConversionRateAll' ], [action.yearReportData]

выход:

{
  source: ['stravi/aa', 'stravi/ab', 'stravi/ac'],
  sessions: ['202001', '202003', '202007']
  ...
}

Я бы хотел использовать loda sh, и я пытаюсь:

   lodash.map(rows, arr =>
                lodash.zipObject(['source', 'sessions', 'adClicks', 'adCost', 'CPC', 'CTR', 'goalCompletionsAll', 'goalConversionRateAll'], arr))

Но это неверно ... Я получил несколько объектов. Я хотел бы иметь один объект со всеми данными. Как мой пример.

Ответы [ 3 ]

2 голосов
/ 29 мая 2020

зачем использовать стороннюю библиотеку, если можно так легко

let result = rows.reduce((obj, arr) => {
  arr.forEach((item, i) => {
    if (!obj[dictionary[i]]) {
      obj[dictionary[i]] = [];
    }
    obj[dictionary[i]].push(item);
  })
  return obj;
}, {});
1 голос
/ 29 мая 2020

Разархивируйте rows, чтобы транспонировать подмассивы, а затем используйте zip-объект:

const { flow, unzip, zipObject } = _

const fn = flow(
  unzip,
  arr => zipObject(['source', 'sessions', 'adClicks', 'adCost', 'CPC', 'CTR', 'goalCompletionsAll', 'goalConversionRateAll'], arr)
)

const rows = [["stravi/aa","202001","59","51","2558.98","0.5358894453719162","1.9204668112983725","140","2.3466309084813943"],["stravi/ab","202003","3591","349","2246.09","0.41838214","3.57603358","50","4.82115474"],["stravi/ac","202007","3354","25","1975.76","0.74220667708","1.12321555541","11","0.9324532454"]]

const result = fn(rows)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
1 голос
/ 29 мая 2020

Вам нужен reducer вместо map . Карта просто преобразует каждый элемент, поэтому вы получаете несколько элементов.

Я бы использовал простой JS для этого. Это будет выглядеть так:

const rows = [
  [
    'stravi/aa',
    '202001',
    '59',
    '51',
    '2558.98',
    '0.5358894453719162',
    '1.9204668112983725',
    '140',
    '2.3466309084813943',
  ],
  [
    'stravi/ab',
    '202003',
    '3591',
    '349',
    '2246.09',
    '0.41838214',
    '3.57603358',
    '50',
    '4.82115474',
  ],
  [
    'stravi/ac',
    '202007',
    '3354',
    '25',
    '1975.76',
    '0.74220667708',
    '1.12321555541',
    '11',
    '0.9324532454',
  ],
];

const keys = [
  'source',
  'sessions',
  'adClicks',
  'adCost',
  'CPC',
  'CTR',
  'goalCompletionsAll',
  'goalConversionRateAll',
  'missingFieldName',
];

const initialAcc = keys.reduce((acc, cur) => {
  acc[cur] = [];
  return acc;
}, {});

const resultAcc = rows.reduce((acc, cur) => {
  cur.forEach((value, index) => acc[keys[index]].push(value));
  return acc;
}, initialAcc);

console.log(resultAcc);
...