【问题标题】:How to iterate through an array of objects and sum a specific property with Javascript [closed]如何遍历对象数组并使用Javascript对特定属性求和[关闭]
【发布时间】:2021-09-22 12:09:23
【问题描述】:

我有一组对象,我需要滚动它们并添加 Maria 和 Cristiano 的战斗胜利,最后我需要显示每个人赢得了多少 BattleWon,如示例所示

 const array = [
      {
        id: '147acaa3-363c-4a28-af43-fcc035a1d500',
        arena: 'Philippine Arena',
        firstParticipant: {
          address: '0x3ba59bcc1a02cb46e7de35fb0bacc860bf075661',
          name: 'Cristiano',
          battlesWon: 0
        },
        secondParticipant: {
          address: '0x3ba59bcc1a02cb46e7de35fb0bacc860bf075644',
          name: 'Maria',
          battlesWon: 1
        },
        logs: [ [Object] ]
      },
      {
        id: 'b2ef2d28-d84d-4cc9-946f-3d57b8ce05ab',
        arena: 'Greensboro Coliseum',
        firstParticipant: {
          address: '0x3ba59bcc1a02cb46e7de35fb0bacc860bf075644',
          name: 'Maria',
          battlesWon: 1
        },
        secondParticipant: {
          address: '0x3ba59bcc1a02cb46e7de35fb0bacc860bf075661',
          name: 'Cristiano',
          battlesWon: 0
        },
        logs: [ [Object] ]
      }
    ]

预期:

{
  Cristiano: 0,
  Maria: 2
}

【问题讨论】:

标签: javascript arrays


【解决方案1】:

我认为一种可能的解决方案是使用 forEach 循环遍历数组,然后将值添加到结果字典中,如您在此处看到的:

let list = [
    {
        id: '147acaa3-363c-4a28-af43-fcc035a1d500',
        arena: 'Philippine Arena',
        firstParticipant: {
            address: '0x3ba59bcc1a02cb46e7de35fb0bacc860bf075661',
            name: 'Cristiano',
            battlesWon: 0
        },
        secondParticipant: {
            address: '0x3ba59bcc1a02cb46e7de35fb0bacc860bf075644',
            name: 'Maria',
            battlesWon: 1
        },
        logs: [[Object]]
    },
    {
        id: 'b2ef2d28-d84d-4cc9-946f-3d57b8ce05ab',
        arena: 'Greensboro Coliseum',
        firstParticipant: {
            address: '0x3ba59bcc1a02cb46e7de35fb0bacc860bf075644',
            name: 'Maria',
            battlesWon: 1
        },
        secondParticipant: {
            address: '0x3ba59bcc1a02cb46e7de35fb0bacc860bf075661',
            name: 'Cristiano',
            battlesWon: 0
        },
        logs: [[Object]]
    }
]

let results = {
    Cristiano: 0,
    Maria: 0
}

list.forEach(arena => {
    results[arena.firstParticipant.name] += arena.firstParticipant.battlesWon
    results[arena.secondParticipant.name] += arena.secondParticipant.battlesWon
})

console.log(results)

【讨论】:

    【解决方案2】:

    您可以使用Array.prototype.reduce 遍历数据中的每个条目,然后将参与者数据写入累加器。优点是您不需要在函数之外创建单独的对象。

    然后,在reduce() 的每次迭代中,您只需使用一个通用函数将参与者数据写入累加器:

    function handleParticipant(participant, acc) {
      const { name, battlesWon } = participant;
      acc[name] = (acc[name] || 0) + battlesWon;
    }
    

    真正的逻辑在acc[name] = (acc[name] || 0) + battlesWon这一行,基本上就是说:如果在字典中找到name,则将battlesWon添加到其值中,否则将battlesWon添加到初始值@987654328 @。

    请参阅下面的概念验证:

    const data = [
      {
        id: '147acaa3-363c-4a28-af43-fcc035a1d500',
        arena: 'Philippine Arena',
        firstParticipant: {
          address: '0x3ba59bcc1a02cb46e7de35fb0bacc860bf075661',
          name: 'Cristiano',
          battlesWon: 0
        },
        secondParticipant: {
          address: '0x3ba59bcc1a02cb46e7de35fb0bacc860bf075644',
          name: 'Maria',
          battlesWon: 1
        }
      },
      {
        id: 'b2ef2d28-d84d-4cc9-946f-3d57b8ce05ab',
        arena: 'Greensboro Coliseum',
        firstParticipant: {
          address: '0x3ba59bcc1a02cb46e7de35fb0bacc860bf075644',
          name: 'Maria',
          battlesWon: 1
        },
        secondParticipant: {
          address: '0x3ba59bcc1a02cb46e7de35fb0bacc860bf075661',
          name: 'Cristiano',
          battlesWon: 0
        }
      }
    ];
    
    function handleParticipant(participant, acc) {
      const { name, battlesWon } = participant;
      acc[name] = (acc[name] || 0) + battlesWon;
    }
    
    const battlesWonByName = data.reduce((acc, cur) => {
      const { firstParticipant, secondParticipant } = cur;
      
      handleParticipant(firstParticipant, acc);
      handleParticipant(secondParticipant, acc);
      
      return acc;
    }, {});
    
    console.log(battlesWonByName);

    【讨论】:

      【解决方案3】:

      请使用此代码。

      const arr = [
        {
          id: '147acaa3-363c-4a28-af43-fcc035a1d500',
          arena: 'Philippine Arena',
          firstParticipant: {
            address: '0x3ba59bcc1a02cb46e7de35fb0bacc860bf075661',
            name: 'Cristiano',
            battlesWon: 0
          },
          secondParticipant: {
            address: '0x3ba59bcc1a02cb46e7de35fb0bacc860bf075644',
            name: 'Maria',
            battlesWon: 1
          },
          logs: [ [Object] ]
        },
        {
          id: 'b2ef2d28-d84d-4cc9-946f-3d57b8ce05ab',
          arena: 'Greensboro Coliseum',
          firstParticipant: {
            address: '0x3ba59bcc1a02cb46e7de35fb0bacc860bf075644',
            name: 'Maria',
            battlesWon: 1
          },
          secondParticipant: {
            address: '0x3ba59bcc1a02cb46e7de35fb0bacc860bf075661',
            name: 'Cristiano',
            battlesWon: 0
          },
          logs: [ [Object] ]
        }
      ]
      
      let result = {};
      
      arr.forEach(val => {
        ['firstParticipant', 'secondParticipant'].forEach(key => {
          if(result.hasOwnProperty(val[key]['name'])) {
            result[val[key]['name']] += val[key]['battlesWon'];
          } else {
            result[val[key]['name']] = val[key]['battlesWon'];
          }
        })
      })
      
      console.log(result);

      【讨论】:

        【解决方案4】:

        你可以这样做:

        const json = [
          {
            id: '147acaa3-363c-4a28-af43-fcc035a1d500',
            arena: 'Philippine Arena',
            firstParticipant: {
              address: '0x3ba59bcc1a02cb46e7de35fb0bacc860bf075661',
              name: 'Cristiano',
              battlesWon: 0
            },
            secondParticipant: {
              address: '0x3ba59bcc1a02cb46e7de35fb0bacc860bf075644',
              name: 'Maria',
              battlesWon: 1
            },
            logs: [ [Object] ]
          },
          {
            id: 'b2ef2d28-d84d-4cc9-946f-3d57b8ce05ab',
            arena: 'Greensboro Coliseum',
            firstParticipant: {
              address: '0x3ba59bcc1a02cb46e7de35fb0bacc860bf075644',
              name: 'Maria',
              battlesWon: 1
            },
            secondParticipant: {
              address: '0x3ba59bcc1a02cb46e7de35fb0bacc860bf075661',
              name: 'Cristiano',
              battlesWon: 0
            },
            logs: [ [Object] ]
          }
        ]
        
        var newJson = new Array();
        json.map((battle) => {
            newJson[battle.firstParticipant.name] = newJson[battle.firstParticipant.name] != null ? battle.firstParticipant.battlesWon + newJson[battle.firstParticipant.name] :  battle.firstParticipant.battlesWon;
            newJson[battle.secondParticipant.name] = newJson[battle.secondParticipant.name] != null ? battle.secondParticipant.battlesWon + newJson[battle.secondParticipant.name] :  battle.secondParticipant.battlesWon;
        });
        

        【讨论】:

        • 使用.forEach 而不是.map。 Map 返回新数组,但 foreach 遍历数组元素
        【解决方案5】:

        您可以使用reduce轻松实现结果

        arr.reduce((acc, curr) => {
          const { firstParticipant: { name: a, battlesWon: m }, secondParticipant: { name: b, battlesWon: n } } = curr;
          acc[a] = (acc[a] ?? 0) + m
          acc[b] = (acc[b] ?? 0) + n
          return acc;
        }, {});
        

        1)

        const arr = [
          {
            id: "147acaa3-363c-4a28-af43-fcc035a1d500",
            arena: "Philippine Arena",
            firstParticipant: {
              address: "0x3ba59bcc1a02cb46e7de35fb0bacc860bf075661",
              name: "Cristiano",
              battlesWon: 0,
            },
            secondParticipant: {
              address: "0x3ba59bcc1a02cb46e7de35fb0bacc860bf075644",
              name: "Maria",
              battlesWon: 1,
            },
            logs: [[Object]],
          },
          {
            id: "b2ef2d28-d84d-4cc9-946f-3d57b8ce05ab",
            arena: "Greensboro Coliseum",
            firstParticipant: {
              address: "0x3ba59bcc1a02cb46e7de35fb0bacc860bf075644",
              name: "Maria",
              battlesWon: 1,
            },
            secondParticipant: {
              address: "0x3ba59bcc1a02cb46e7de35fb0bacc860bf075661",
              name: "Cristiano",
              battlesWon: 0,
            },
            logs: [[Object]],
          },
        ];
        
        const result = arr.reduce((acc, curr) => {
          const {
            firstParticipant: { name: name1, battlesWon: battlesWon1 },
            secondParticipant: { name: name2, battlesWon: battlesWon2 },
          } = curr;
        
          acc[name1] ? (acc[name1] += battlesWon1) : (acc[name1] = battlesWon1);
          acc[name2] ? (acc[name2] += battlesWon2) : (acc[name2] = battlesWon2);
        
          return acc;
        }, {});
        
        console.log(result);

        2)

        const arr = [
          {
            id: "147acaa3-363c-4a28-af43-fcc035a1d500",
            arena: "Philippine Arena",
            firstParticipant: {
              address: "0x3ba59bcc1a02cb46e7de35fb0bacc860bf075661",
              name: "Cristiano",
              battlesWon: 0,
            },
            secondParticipant: {
              address: "0x3ba59bcc1a02cb46e7de35fb0bacc860bf075644",
              name: "Maria",
              battlesWon: 1,
            },
            logs: [[Object]],
          },
          {
            id: "b2ef2d28-d84d-4cc9-946f-3d57b8ce05ab",
            arena: "Greensboro Coliseum",
            firstParticipant: {
              address: "0x3ba59bcc1a02cb46e7de35fb0bacc860bf075644",
              name: "Maria",
              battlesWon: 1,
            },
            secondParticipant: {
              address: "0x3ba59bcc1a02cb46e7de35fb0bacc860bf075661",
              name: "Cristiano",
              battlesWon: 0,
            },
            logs: [[Object]],
          },
        ];
        
        const result = arr.reduce((acc, { firstParticipant, secondParticipant }) => {
          acc[firstParticipant.name]
            ? (acc[firstParticipant.name] += firstParticipant.battlesWon)
            : (acc[firstParticipant.name] = firstParticipant.battlesWon);
        
          acc[secondParticipant.name]
            ? (acc[secondParticipant.name] += secondParticipant.battlesWon)
            : (acc[secondParticipant.name] = secondParticipant.battlesWon);
          return acc;
        }, {});
        
        console.log(result);

        【讨论】:

          【解决方案6】:

          如果您使用的是 nodeJs 并且您有一个额外的 'Johnn' 来检查这将是

          有用

          import lodash  from 'lodash';
          const arr = [
              {
                id: "147acaa3-363c-4a28-af43-fcc035a1d500",
                arena: "Philippine Arena",
                firstParticipant: {
                  address: "0x3ba59bcc1a02cb46e7de35fb0bacc860bf075661",
                  name: "Cristiano",
                  battlesWon: 0,
                },
                secondParticipant: {
                  address: "0x3ba59bcc1a02cb46e7de35fb0bacc860bf075644",
                  name: "Maria",
                  battlesWon: 1,
                },
                logs: [[Object]],
              },
              {
                id: "b2ef2d28-d84d-4cc9-946f-3d57b8ce05ab",
                arena: "Greensboro Coliseum",
                firstParticipant: {
                  address: "0x3ba59bcc1a02cb46e7de35fb0bacc860bf075644",
                  name: "John",
                  battlesWon: 1,
                },
                secondParticipant: {
                  address: "0x3ba59bcc1a02cb46e7de35fb0bacc860bf075661",
                  name: "Cristiano",
                  battlesWon: 0,
                },
                logs: [[Object]],
              },
            ];
          
          const input = ['Cristiano', 'Maria', 'John'];
          const attr = [{
              selector: 'firstParticipant.name',
              sum: 'firstParticipant.battlesWon'
          },{
              selector: 'secondParticipant.name',
              sum: 'secondParticipant.battlesWon'
          }];
          
          function getResult(arr, attr, input) {
              let result = {};
              arr.forEach((obj) => {
                  attr.forEach((param)=>{
                      let index = input.indexOf(lodash.get(obj, param.selector));
                      let value = lodash.get(obj, param.sum);
                      if( index > -1) {
                          result[input[index]] = result[input[index]] ? (result[input[index]] + value) : value;
                      }
                  });
              });
              return result;
          }
          console.log(getResult(arr, attr, input));
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-05-12
            • 1970-01-01
            • 1970-01-01
            • 2011-12-10
            • 2016-12-19
            • 1970-01-01
            • 2020-11-15
            相关资源
            最近更新 更多