如何使用 ._groupBy 格式化复杂的数组

问题描述

我的数组看起来像,但包含 1000 多个对象:

    data = {
  0: {
    code: '3019476',_id: '60033f61-8a4e-4622-9731-decd07bc44e1',vendor: 'DKNY',tags: [
      { type: 1,label: 'dsfs' },{ type: 2,label: 'thisOne' },{ type: 3,label: 'sdas' },],},1: {
    code: '3019475',_id: '60033f61-8a4e-4622-9731-decd07bc44e0',label: 'sdfsd' },label: 'anotherone' },2: {
    code: '3019474',_id: '60033f61-8a4e-4622-9731-decd07bc44e9',label: 'gregf' },};

我希望这是输出

0: {title: "thisOne",data: Array(2)"}
1: {title: "anotherone",data: Array(1)"}

所以我想过滤并计算有多少个对象包含不同的 tag[1].label,将完整的项目数据保存在结果中的 'data' 中。

我所有的想法都失败了,所以我真的需要你的帮助

解决方法

数据中有很多语法错误,修复它们,它应该可以工作。请参阅下面的代码片段。

注意:对象中的键/值对应该用逗号分隔,dsfsthisOne sdas 应该是有效的变量或字符串。

data = {
  0: {
    code: '3019476',_id: '60033f61-8a4e-4622-9731-decd07bc44e1',vendor: 'DKNY',tags: [
      { type: 1,label: 'dsfs' },{ type: 2,label: 'thisOne' },{ type: 3,label: 'sdas' },],},1: {
    code: '3019475',_id: '60033f61-8a4e-4622-9731-decd07bc44e0',label: 'sdfsd' },label: 'anotherOne' },2: {
    code: '3019474',_id: '60033f61-8a4e-4622-9731-decd07bc44e9',label: 'gregf' },};

console.log(data[0].tags[1].label)

,

你不需要 lodash。您可以使用普通的 javascript。

const data= [
{code: "3019476",_id: "60033f61-8a4e-4622-9731-decd07bc44e1",vendor: "DKNY",tags: [{type: 1,label: 'dsfs'},{type: 2,label: 'thisOne'},{type: 3,label: 'sdas'}]},{code: "3019475",_id: "60033f61-8a4e-4622-9731-decd07bc44e0",label: 'sdfsd'},label: 'anotherOne'},label: 'sdfsd'}]},{code: "3019474",_id: "60033f61-8a4e-4622-9731-decd07bc44e9",label: 'gregf'},label: 'gregf'}]}]

const newData = data.map(d => { 
  let result = {};
  result.title = d.tags.find(tag => tag.type === 2).label;
  result.data = d.tags.filter(tag => tag.type === 2); 
  return result;
});

console.log(newData);

P.S.:此代码段考虑到可以将多个 tagType 包含到数据数组中,并且第一个找到的将用作标题。 如果这不是您想要的,那么问题应该更清楚。

,

我怀疑您正在寻找带有 groupBy property pathiteratee shorthand

import { groupBy } from 'underscore';

groupBy(data,['tags',1,'label']);
// { thisOne: [Object,Object],//   anotherOne: [Object]
// }

这会生成一个以标签为键、以组为值的对象。从这里开始,可以很容易地以您的问题的示例输出的确切形状获得它,例如使用 chainmap

import { chain } from 'underscore';

chain(data)
    .groupBy(['tags','label'])
    .map((data,title) => ({data,title}))
    .value();
// [ { title: 'thisOne',data: [Object,Object] },//   { title: 'anotherOne',data: [Object] }
// ]