Lodash从数组数组创建对象

问题描述 投票:0回答:3

我想使用lodash从数组数组中生成对象。我用它lodash.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']
...
}

我想使用lodash,我尝试:

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

但是不正确...我收到了多个对象。我想要一个包含所有数据的对象。就像我的例子。

javascript typescript lodash
3个回答
0
投票

为什么使用第三方库,如果可能这样容易的话

let result = rows.reduce((obj, arr) => {
  arr.forEach((item, i) => {
    if (!obj[dictionary[i]]) {
      obj[dictionary[i]] = [];
    }
    obj[dictionary[i]].push(item);
  })
  return obj;
}, {});

0
投票

您需要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);

0
投票

解压缩rows进行转置,然后压缩对象:

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>
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.