代码之家  ›  专栏  ›  技术社区  ›  Damien

如何从对象数组中获取关键帧和每个关键帧的计数

  •  0
  • Damien  · 技术社区  · 7 年前

    我正在努力获得下面的预期结果,但我正在努力。最好的方法是什么?

    const data = [{
        name: 'Dave',
        country: 'England',
        color: 'Brown'
      },
      {
        name: 'Dave',
        country: 'England',
        color: 'white'
      },
      {
        name: 'Cae',
        country: 'USA',
        color: 'white'
      },
      {
        name: 'Dave',
        country: 'England',
        color: 'Red'
      },
      {
        name: 'Cae',
        country: 'USA',
        color: 'Yellow'
      },
      {
        name: 'Dave',
        country: 'England',
        color: 'white'
      },
      {
        name: 'Manuel',
        country: 'USA',
        color: 'Red'
      },
      {
        name: 'Dave',
        country: 'England',
        color: 'white'
      }
    ];
    
    
    // Tentative:
    
    (function getDataForName() {
      count = 0;
      nameL = [];
      nameCount = [];
      for (let i = 0; i < data.length; i++) {
        if (nameL.indexOf(data[i].name) === -1) {
          nameL.push(data[i].name);
          count++;
        }
        nameCount.push(count);
      }
      console.log(nameL);
      console.log(nameCount);
    })()

    预期结果:

    nameL = ['Dave', 'Cae', 'Manuel'];
    nameCount = [4, 2, 1];
    
    5 回复  |  直到 7 年前
        1
  •  2
  •   Nenad Vracar    7 年前

    使用Lodash,您可以使用 countBy 方法获取一个对象,然后可以使用 keys values 该对象上的方法。

    const data = [{name: 'Dave', country: 'England', color: 'Brown'},{name: 'Dave', country: 'England', color: 'white'},{name: 'Cae', country: 'USA', color: 'white'},{name: 'Dave', country: 'England', color: 'Red'},{name: 'Cae', country: 'USA', color: 'Yellow'},{name: 'Dave', country: 'England', color: 'white'},{name: 'Manuel', country: 'USA', color: 'Red'},{name: 'Dave', country: 'England', color: 'white'}]
    
    const result = _.countBy(data, 'name')
    const names = _.keys(result);
    const count = _.values(result);
    
    console.log(names);
    console.log(count)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>
        2
  •  2
  •   user3483203    7 年前

    这对你有什么作用? Array.prototype.reduce() 只需在传入之前的值时继续调用数组上的回调。

    const data = [{name: 'Dave', country: 'England', color: 'Brown'},{name: 'Dave', country: 'England', color: 'white'},{name: 'Cae', country: 'USA', color: 'white'},{name: 'Dave', country: 'England', color: 'Red'},{name: 'Cae', country: 'USA', color: 'Yellow'},{name: 'Dave', country: 'England', color: 'white'},{name: 'Manuel', country: 'USA', color: 'Red'},{name: 'Dave', country: 'England', color: 'white'}];
    
    x = data.reduce(function(sums,entry){
       sums[entry.name] = (sums[entry.name] || 0) + 1;
       return sums;
    },{});
    
    console.log(x)
        3
  •  1
  •   stasovlas    7 年前

    另一种方式:

    const [nameL, nameCount] = _.chain(data)
        .groupBy('name')
        .mapValues(_.size)
        .toPairs()
        .thru(_.spread(_.zip))
        .value();
    
        4
  •  0
  •   Ele    7 年前

    使用该功能 forEach 以及功能 Object.keys Object.values .

    const data = [    {name: 'Dave', country: 'England', color: 'Brown'},    {name: 'Dave', country: 'England', color: 'white'},    {name: 'Cae', country: 'USA', color: 'white'},    {name: 'Dave', country: 'England', color: 'Red'},    {name: 'Cae', country: 'USA', color: 'Yellow'},    {name: 'Dave', country: 'England', color: 'white'},    {name: 'Manuel', country: 'USA', color: 'Red'},    {name: 'Dave', country: 'England', color: 'white'}    ],
          a = {};
    
    data.forEach((c) => a[c.name] = (a[c.name] || 0) + 1);
    
    console.log(JSON.stringify(Object.keys(a)));
    console.log(JSON.stringify(Object.values(a)));
    .as-console-wrapper { max-height: 100% !important; top: 0; }
        5
  •  0
  •   connexo    7 年前

    这样做不需要任何外部库:

    const data=[{name:'Dave',country:'England',color:'Brown'},{name:'Dave',country:'England',color:'white'},{name:'Cae',country:'USA',color:'white'},{name:'Dave',country:'England',color:'Red'},{name:'Cae',country:'USA',color:'Yellow'},{name:'Dave',country:'England',color:'white'},{name:'Manuel',country:'USA',color:'Red'},{name:'Dave',country:'England',color:'white'}];
    
    const result = data.reduce(function(count, entry){
       count[entry.name] = count[entry.name] ? count[entry.name] + 1 : 1;
       return count;
    },{});
    
    console.log(Object.keys(result));
    console.log(Object.values(result));