【问题标题】:looping through Javascript Object returning sum of values循环遍历 Javascript 对象返回值的总和
【发布时间】:2016-10-24 16:01:02
【问题描述】:

我要做的是遍历一个对象,获取每个候选者出现的总次数并将其打印到页面上。

我一直在为这个问题绞尽脑汁。我是 javascript 新手,使用对象对我来说是非常新鲜的事情。

感谢您的帮助!

var entry = [
  {
    candidate : "guy1",
    rank : 1,
    state : "AK",
    vote_count : "2"
  },
  {
    candidate : "guy2",
    rank : 1,
    state : "MI",
    vote_count : "3"
  },
  {
    candidate : "guy3",
    rank : 1,
    state : "AK",
    vote_count : "5"
  },
  {
    candidate : "guy2",
    rank : 1,
    state : "AL",
    vote_count : "4"
  },
  {
    candidate : "guy2",
    rank : 1,
    state : "FL",
    vote_count : "9"
  },
  {
    candidate : "guy1",
    rank : 1,
    state : "MN",
    vote_count : "7"
  }
];

for ( var i = 0, l = entry.canidate.length; i < l; i++ ) {
    guy1 += entry.canidate[i];
}

console.log(guy1);

【问题讨论】:

  • 明确地说,您是要获取候选人出现的次数,还是求该候选人的总票数?
  • canidate !== candidate。你有什么问题?
  • 你有一个类型entry.canidate 应该是candidate。此外,entry.candidate 不是一个集合。 entry 是一个集合。
  • 对不起。是的,我正在寻找每个候选人出现的总次数。

标签: javascript jquery arrays loops object


【解决方案1】:

您可以使用以候选人为关键字的对象并计算选票。

var entry = [{ candidate: "guy1", rank: 1, state: "AK", vote_count: "2" }, { candidate: "guy2", rank: 1, state: "MI", vote_count: "3" }, { candidate: "guy3", rank: 1, state: "AK", vote_count: "5" }, { candidate: "guy2", rank: 1, state: "AL", vote_count: "4" }, { candidate: "guy2", rank: 1, state: "FL", vote_count: "9" }, { candidate: "guy1", rank: 1, state: "MN", vote_count: "7" }],
    count = {};

entry.forEach(function (a) {
    count[a.candidate] = (count[a.candidate] || 0) + +a.vote_count;
});

console.log(count);

【讨论】:

  • 为什么不像其他答案那样使用 reduce?
  • 因为在这种情况下reduce总是返回对象count,这不是必须的。
【解决方案2】:

您可以使用候选人的投票总和创建一个新对象,如下所示:

https://jsfiddle.net/he58xsb8/

var entry = [
  {
    candidate : "guy1",
    rank : 1,
    state : "AK",
    vote_count : "2"
  },
  {
    candidate : "guy2",
    rank : 1,
    state : "MI",
    vote_count : "3"
  },
  {
    candidate : "guy3",
    rank : 1,
    state : "AK",
    vote_count : "5"
  },
  {
    candidate : "guy2",
    rank : 1,
    state : "AL",
    vote_count : "4"
  },
  {
    candidate : "guy2",
    rank : 1,
    state : "FL",
    vote_count : "9"
  },
  {
    candidate : "guy1",
    rank : 1,
    state : "MN",
    vote_count : "7"
  }
];

var voteByCandidate = {};
for ( var i = 0; i < entry.length; i++ ) {
    var result = entry[i];
    if (!voteByCandidate[result.candidate]) {
        voteByCandidate[result.candidate] = 0;
    }
    voteByCandidate[result.candidate] += result.vote_count * 1; // Convert to number.
}

console.log(voteByCandidate);

【讨论】:

    【解决方案3】:

    您可以创建一个候选映射和循环条目数组。对于每个相同的候选增加映射中的键。

    var candidateMap = {};
    
    entry.forEach( function(candidate) {
       candidateMap[candidate.candidate] = candidateMap[candidate.candidate] || 0;
    candidateMap[candidate.candidate] += 1;
    }); 
    

    【讨论】:

      【解决方案4】:

      我正在寻找每个候选人出现的总次数

      您可以使用数组filter 过滤候选人然后reduce 来统计每个候选人的出现次数

      var _filter=[];
      entry.filter(function(item){
        _filter.push(item.candidate)
      })
      
      var _reducedArray =_filter.reduce(function(prev,next){
              prev[next] = (prev[next] + 1) || 1;
              return prev;
          },{});
      
      console.log(_reducedArray);
      

      JSFIDDLE

      【讨论】:

        【解决方案5】:

        您可以使用 reduce 轻松做到这一点:

        var entries = [{ candidate: "guy1", rank: 1, state: "AK", vote_count: "2" }, { candidate: "guy2", rank: 1,  state: "MI", vote_count: "3" }, { candidate: "guy3", rank: 1, state: "AK", vote_count: "5" }, { candidate: "guy2", rank: 1, state: "AL", vote_count: "4" }, { candidate: "guy2", rank: 1, state: "FL", vote_count: "9" }, { candidate: "guy1", rank: 1, state: "MN", vote_count: "7" }];
        var result = entries.reduce(function(r, c) {
          r[c.candidate] = (r[c.candidate] || 0) + parseInt(c.vote_count);
          return r;
        }, {});
        console.log(result);

        【讨论】:

          【解决方案6】:

          这可能是你需要的:

          const votes = {};
          entry.foraEach(item => {
              if(!votes.hasOwnProperty(item.candidate)) {
                  votes[item.candidate] = +item.vote_count;
              } else votes[item.candidate] += +item.vote_count;
          });
          

          您将拥有votes 对象中的所有候选人和选票。

          【讨论】:

            【解决方案7】:

            var entry = [
              {
                candidate : "guy1",
                rank : 1,
                state : "AK",
                vote_count : "2"
              },
              {
                candidate : "guy2",
                rank : 1,
                state : "MI",
                vote_count : "3"
              },
              {
                candidate : "guy3",
                rank : 1,
                state : "AK",
                vote_count : "5"
              },
              {
                candidate : "guy2",
                rank : 1,
                state : "AL",
                vote_count : "4"
              },
              {
                candidate : "guy2",
                rank : 1,
                state : "FL",
                vote_count : "9"
              },
              {
                candidate : "guy1",
                rank : 1,
                state : "MN",
                vote_count : "7"
              }
            ];
            
            function getCandidateTimes(entry, candidateName){
              var appearTimes = 0;
              for (var i=0, len = entry.length; i < len; i++){
                if(entry[i].candidate == candidateName){
                  appearTimes++;
                }
              }
              return appearTimes;
            }
            
            var guy1AppearTimes = getCandidateTimes(entry, 'guy1');
            console.log('guy1 appears ' + guy1AppearTimes + ' times!');
            
            var guy2AppearTimes = getCandidateTimes(entry, 'guy2');
            console.log('guy2 appears ' + guy2AppearTimes + ' times!');
            
            //and so on.......

            【讨论】:

            • 您可以考虑在您的答案中添加一些解释。
            • 我很抱歉没有任何解释地回答,这是我第一次在stackoverflow中回答问题..
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-14
            • 2013-03-09
            • 2015-09-16
            相关资源
            最近更新 更多