【问题标题】:How to format complicated array with ._groupBy如何使用 ._groupBy 格式化复杂数组
【发布时间】:2021-04-03 04:37:48
【问题描述】:

我的数组看起来像,但包含 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',
    vendor: 'DKNY',
    tags: [
      { type: 1, label: 'sdfsd' },
      { type: 2, label: 'anotherOne' },
      { type: 3, label: 'sdfsd' },
    ],
  },
  2: {
    code: '3019474',
    _id: '60033f61-8a4e-4622-9731-decd07bc44e9',
    vendor: 'DKNY',
    tags: [
      { type: 1, label: 'gregf' },
      { type: 2, label: 'thisOne' },
      { type: 3, label: 'gregf' },
    ],
  },
};

我希望这是输出:

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

所以我想过滤和统计有多少对象包含不同的标签[1].label,将完整的项目数据保存在结果中的“数据”中。

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

【问题讨论】:

  • data 有很多语法错误,请尝试修复它们
  • 请在问题中包含您失败的想法。它可以帮助人们回答您的问题,也可以帮助您从中了解更多信息。

标签: javascript arrays underscore.js


【解决方案1】:

我怀疑您正在寻找带有property path iteratee shorthandgroupBy

import { groupBy } from 'underscore';

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

这会生成一个对象,其中标签作为键,组作为值。从这里,很容易得到与您问题的示例输出完全相同的形状,例如使用chainmap

import { chain } from 'underscore';

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

【讨论】:

    【解决方案2】:

    数据中有很多语法错误,修复它们,它应该可以工作。见下面的代码 sn-p。

    注意:对象中的键/值对应该用逗号分隔,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',
        vendor: 'DKNY',
        tags: [
          { type: 1, label: 'sdfsd' },
          { type: 2, label: 'anotherOne' },
          { type: 3, label: 'sdfsd' },
        ],
      },
      2: {
        code: '3019474',
        _id: '60033f61-8a4e-4622-9731-decd07bc44e9',
        vendor: 'DKNY',
        tags: [
          { type: 1, label: 'gregf' },
          { type: 2, label: 'thisOne' },
          { type: 3, label: 'gregf' },
        ],
      },
    };
    
    console.log(data[0].tags[1].label)

    【讨论】:

      【解决方案3】:

      你不需要 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", vendor: "DKNY", tags: [{type: 1, label: 'sdfsd'},{type: 2, label: 'anotherOne'},{type: 3, label: 'sdfsd'}]}, {code: "3019474", _id: "60033f61-8a4e-4622-9731-decd07bc44e9", vendor: "DKNY", tags: [{type: 1, label: 'gregf'},{type: 2, label: 'thisOne'},{type: 3, 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.:这个 sn-p 考虑到数据数组中可以包含多个 tagType,并且第一个找到的将用作标题。 如果这不是您想要的,那么问题应该更清楚。

      【讨论】:

      • 如果库 X 本身是用纯 JavaScript 编写的,“你不需要库 X,你可以使用纯 JavaScript”总是为真。这并不意味着您不应该使用库 X。库可以节省工作量,因此您无需重新发明轮子。
      • 是的,但在这种情况下,当已经有一个轮子可以使用时,你并没有重新发明轮子。当不再支持该库时,将支持 javascript。但我理解你的观点,我同意他要求使用图书馆。谢谢!我会在以后的回答中考虑这一点。
      猜你喜欢
      • 1970-01-01
      • 2018-05-12
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 2018-10-15
      相关资源
      最近更新 更多