【问题标题】:sum object from multi arrays in app script应用脚本中来自多个数组的对象求和
【发布时间】:2021-09-26 18:27:09
【问题描述】:

我正在使用应用脚本

我通过这段代码从 API 返回数组:

const price= jsonResponce.price.map(obj => [obj[0],obj[1]]);

给我[[30.56, 1.014], [50.44, 1.019], [10.35, 1.081], [10.34, 1.115], [10.40, 2.006]]

不是这个数组可以有 1000 个数组或很大

现在我想用这段代码对 obj[0] 中的所有对象求和:

我使用 to 方法来查看尊重,但没有任何效果

var first= [];
var second= 0;

price.forEach(function(obj){
   first+= obj[0];
   second+= obj[1];
  });
Logger.log(first);
Logger.log(second);

但是给我这样的结果:首先Logger.log(first);

30.5650.4410.3510.3410.40

第二个Logger.log(second); : 这个方法在任何obj之后添加数字0

01.01401.01901.08101.11502.006

关于这个问题的任何想法

30.56+50.44+10.35+10.34+10.40 我需要结果为:112.09

【问题讨论】:

  • first 是一个数组,而不是一个数字。
  • 是的,我知道这样做只是为了测试

标签: javascript google-apps-script google-sheets


【解决方案1】:

经过最少的更正,您的代码对我来说可以正常工作:

const price = [[30.56, 1.014], [50.44, 1.019], [10.35, 1.081], [10.34, 1.115], [10.40, 2.006]]

var first  = 0; // <-- here
var second = 0;

price.forEach(obj => {
   first  += +obj[0];  // <-- here
   second += +obj[1];  // <-- here
});

console.log(first);  // --> 112.09
console.log(second); // --> 6.2349

这样可以得到点后面的四位数字:

var a = 1.23456789;
var b = 1234.56789;
var c = 16643.59000000003

const dot1000 = x => Math.round(x*10000)/10000;

console.log(dot1000(a));
console.log(dot1000(b));
console.log(dot1000(c));

另一种实现(末尾有零)

var a = 1.23456789
var b = 1234.56789
var c = 16643.59000000003

const dot1000 = x => parseInt(x) + '.' + (x+.00001+'').split('.')[1].slice(0,4)

console.log(dot1000(a))
console.log(dot1000(b))
console.log(dot1000(c))

更新

现代 JavaScript (ES2017) 可以通过这种方式添加零:

console.log('123'.padEnd(5,'0')); // 12300

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padEnd

【讨论】:

  • 谢谢兄弟。
  • 有时间给我这样的结果:1.529540000000000116643.59000000003 ,我可以分割结果,但在点之后,从第一个数字开始的简单方法 .slice(0,5) ,我想看到这样的: 1.529516643.5900
  • 我添加了一个常用技巧来限制点后的最大数字数。它会给你16643.59 而不是16643.59000000003。但是,如果您希望最后为零 (16643.5900),则需要另一个实现。
  • 我添加了另一个实现,末尾有零。
  • 最后一个公式很好用,感谢兄弟的帮助
【解决方案2】:

numbersInArray = price.flat()

让总和 = 0 numbersInArray.forEach(number => sum += number)

【讨论】:

    【解决方案3】:

    使用Array.prototype.reduce()方法,这变得非常简单:

    const result = arr.reduce((total, el)=> {
        return total + el[0] + el[1] // el = [a, b]
    }, 0)
    
    console.log(result) /// 118.325
    

    如果这是您想要的或者您想要任何改进,请在 cmets 中告诉我

    【讨论】:

      【解决方案4】:

      您正在添加一个数组,其中每个数字(obj[0]obj[1] 值)都被视为字符串类型。这就是为什么它们不是像数字一样添加而是连接起来的原因。首先将字符串类型转换为数字。那么你的问题就解决了。

      因为我不知道使用的 API。所以我无法给出包含 API 响应的答案。但我给你的代码是我做了一些改变,但看看我使用的 praseFloat() 方法。

      const Api_Response_Array = [["30.56", "1.014"], ["50.44", "1.019"], ["10.35", "1.081"], ["10.34", "1.115"], ["10.40", "2.006"]];
      var first= 0;
      var second= 0;
      
      Api_Response_Array.forEach(function(){
         first+= parseFloat(Api_Response_Array[0][0]);
         second+= parseFloat(Api_Response_Array[0][1]);
      });
      document.write(first + "<br>");
      document.write(second);

      只需在 forEach 循环中使用的函数内部使用 praseFloat 方法。它将字符串转换为数字。

      【讨论】:

      • 我试过了,但是不行,你能不能用代码写出来,帮助所有的社会人
      • 好的,我编辑我的答案。
      猜你喜欢
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多