【问题标题】:Javascript : Sum into arrayJavascript:求和到数组
【发布时间】:2015-07-07 07:34:04
【问题描述】:

我的功能是:

var myArray = new Array();
$('input:checked').each(function(index) {
    myArray .push($(this).attr('id') + " : " +$(this).val());
});

让我知道如何在这个数组中求和:

myArray [ "Apple: 10", "Apple: 3", "Banana: 3", "Pear: 7", "Pineapple: 7" ]

我的结果 >

myNewArray [ "Apple: 13",  "Banana: 3", "Pear: 7", "Pineapple: 7" ]

感谢您的帮助!

【问题讨论】:

  • 到目前为止你尝试了什么?给我们看一些代码。
  • 嗯,对数组求和的一种方法是将字符串 "Apple: 10", "Apple: 3" 替换为字符串 "Apple: 10", "Apple: 3"
  • 你有重复的ID吗???解决这个问题!
  • 您需要查看用于存储数据的 JS 对象的类型。数组在这里真的不合适。对象会好很多。 (换句话说,@Masiorama 所说的)。
  • 我投票决定将此问题作为离题结束,因为它是一个 XY 问题,来自不应该存在的情况(重复 ID)。

标签: javascript jquery object sum


【解决方案1】:

试试这样的。

var data =  [ "Apple: 10", "Apple: 3", "Banana: 3", "Pear: 7", "Pineapple: 7" ];
var newObject = {};
var sum = 0;
$.each(data,function(k,v){
  var key = v.split(":")[0];
  var value = v.split(":")[1];
  if((key in newObject))
  {
    newObject[key] = parseInt(newObject[key]) + parseInt(value);
  }
  else
  {
    newObject[key] = $.trim(value);
  }
  
});
console.log(newObject);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

【讨论】:

  • 它甚至不做提问者想要它做的事情
  • OP 想要数组中值的总和,现在 OP 有更改代码。
  • 该示例自第一次修订以来就存在
  • 调用对象newArray 有点混乱
  • @JanDvorak,现在可以了吗?
【解决方案2】:

这是一个对象版本。这并不是你真正想要的,但实际上是一样的,老实说,因为它是一种数据结构,所以更简洁一些。

var myArray = [ "Apple: 10", "Apple: 3", "Banana: 3", "Pear: 7", "Pineapple: 7" ];
var newArray = {};

myArray.forEach(function(val) {
  var item =  val.split(":");
  var key = item[0];
  var num = parseInt(item[1], 10);

  if ( newArray.hasOwnProperty(key) ){
    newArray[key] += num;
  } else {
    newArray[key] = num;
  }

});

alert ( JSON.stringify(newArray) );

而且,正如 cmets 中所说,当我们查看时:

myArray .push($(this).attr('id') + " : " +$(this).val());

myArray [ "Apple: 10", "Apple: 3", "Banana: 3", "Pear: 7", "Pineapple: 7" ]

您的文档中似乎有重复的 ID,需要首先修复,因为 ID 在任何给定文档中都必须是唯一的。

【讨论】:

    【解决方案3】:

    之前的答案是错误的。 我已经修好了,对不起

    var myArray = [ "Apple: 10", "Apple: 3", "Banana: 3", "Pear: 7", "Pineapple: 7" ],
    newArray= {},
    i,
    temp;
    for (i=0; i<myArray.length;i++){
         temp = myArray[i].split(':');
         temp[0] = temp[0].replace( /\s/g, "");
         temp[1] = temp[1].replace( /\s/g, "");
        if(newArray[temp[0]]){
             newArray[temp[0]] = newArray[temp[0]] + parseInt(temp[1]);
        }else{
              newArray[temp[0]] = parseInt(temp[1]);
        }
     }
     console.log(newArray); 
    

    【讨论】:

    • 你认为这会返回 OP 的要求吗?
    • @dystroy 我已修复。我的错误
    【解决方案4】:

    使用正则表达式拆分数组元素并将它们添加到临时对象:

    var regex = /([A-Za-z]+): (\d+)/
    var obj = {};
    for (var i = 0, l = arr.length; i < l; i++) {
      var match = arr[i].match(regex);
      var name = match[1];
      var value = match[2];
      if (!obj[name]) obj[name] = 0;
      obj[name] += +value;
    }
    

    这会给你一个看起来像这样的对象:

    console.log(obj) // { Apple: 13, Banana: 3, Pear: 7, Pineapple: 7 }
    

    就我个人而言,我会这样保留它,因为对象真的很容易操作。

    但是,如果您真的需要再次将数据返回到数组中,只需遍历对象并将字符串作为元素推送到数组中:

    var out = [];
    for (var p in obj) {
        out.push(p + ': ' + obj[p]);
    }
    
    console.log(out) // [ "Apple: 13", "Banana: 3", "Pear: 7", "Pineapple: 7" ]
    

    DEMO

    【讨论】:

      猜你喜欢
      • 2013-05-23
      • 1970-01-01
      • 2019-01-22
      • 2016-10-24
      • 1970-01-01
      • 2023-01-23
      • 2016-09-22
      • 1970-01-01
      • 2021-08-18
      相关资源
      最近更新 更多