【问题标题】:Adding success rate to each object in an array in JavaScript [closed]在JavaScript中为数组中的每个对象添加成功率[关闭]
【发布时间】:2021-04-27 11:56:03
【问题描述】:

我有以下数组:

 const array = [
{operation: 'buy', succeeded: true},
{operation: 'sell', succeeded: false},
{operation: 'buy', succeeded: true}, 
{operation: 'buy', succeeded: false}
]

我想创建一个函数来检查每个参数的成功率(成功:true = 成功,成功:false = 不成功)并计算成功百分比(成功率对于已检查的对象是单独的而不是整个数组)

预期输出:

 const fixedArray = [
{operation: 'buy', succeeded: true, successRate: 100%},
{operation: 'sell', succeeded: false, successRate: 50%},
{operation: 'buy', succeeded: true, successRate: 66%}, 
{operation: 'buy', succeeded: false, successRate: 50%}
]

【问题讨论】:

  • 请添加更多信息。你是如何计算成功率的?
  • 它应该在什么基础上这样做?
  • 评论中提到了。通过每个对象的真或假@AyushKosht​​a
  • @BartKrakowski 已检查元素的基础
  • 不清楚具体是什么问题。难道你不只需要迭代数组并计算买入和卖出的总数以及成功的次数,然后计算吗?

标签: javascript arrays calculation


【解决方案1】:

没有什么是我们用一些简单的数组方法无法完成的——slice()map()reduce()

在我第一次尝试时,我查看了每次迭代的前一个数组项,如下所示:array[index - 1] 但这效率不高,因为它需要更多的数学来估计如何最好地考虑每个新百分比。

相反,在每次映射迭代时,我使用扩展运算符 (...e) 复制了所有现有对象属性,然后添加了 succeessRate 属性。为了计算succeessRate,我首先使用slice() 对源数组从第一项到当前项进行了浅拷贝,将它们的所有succeeded 属性值相加,然后除以项数。

这将产生所需的百分比,但采用十进制数字形式,其中 ⅓ 将读取添加 0.3333... 而不是 33%

为了将数字转换为所需的格式,仍然使用相同的map() 方法,我们将数字乘以100,然后使用Math.floor() 去掉小数点。完成后,我们只需将百分比符号连接到数字的末尾,使其成为所需格式的字符串。

这些是我完成此任务的步骤:

  1. 从第一项到当前项获取数组项slice(0,i+1)
  2. 仅映射到succeeded 属性值map(f => f.succeeded)
  3. 添加值(步骤 1 和 2)reduce((a,b) => a + b, 0)
  4. 除以项目数… / (i + 1)
  5. 乘以 100 并去掉小数 Math.floor(… * 100)
  6. 连接百分号… + "%"

这里全部放在一起写成一个可重用的函数:

const array = [
  { operation: 'buy', succeeded: true },
  { operation: 'sell', succeeded: false },
  { operation: 'buy', succeeded: true },
  { operation: 'buy', succeeded: false }
];

const addSuccessRate = arr => arr.map((e,i) => ({ ...e, succeessRate: Math.floor(arr.slice(0,i+1).map(f => f.succeeded).reduce((a,b) => a + b, 0) / (i + 1) * 100) + "%"}));

const fixedArray = addSuccessRate(array);

console.log(fixedArray);

/* -> [
        { operation: "buy", succeeded: true, succeessRate: "100%" },
        { operation: "sell", succeeded: false, succeessRate: "50%" },
        { operation: "buy", succeeded: true, succeessRate: "66%" },
        { operation: "buy", succeeded: false, succeessRate: "50%" }
      ]
*/

【讨论】:

  • @Nitai 获得任何其他所需格式的百分比也不难——一个不带百分号的整数 (33),一个不带百分比但带小数的浮点数 ( 33.333…),原始小数 (0.3333…),甚至小数 (1/3)
【解决方案2】:

希望对您有所帮助:
如果要在对象中创建新属性,您需要执行以下操作:

object.newPropertyName = newPropertyValue;

所以要解决您的问题,您需要迭代数组并计算成功率
对于数组中的每个对象。这是解决方案:

var moneSuccess = 0, mone = 0;
for(let i = 0; i < array.length; i++){
   mone++;
   if(array[i].succeeded) moneSuccess++;
   array[i].successRate = (moneSuccess / mone) * 100;
}

你可以试试这里的代码:

 const array = [
{operation: 'buy', succeeded: true},
{operation: 'sell', succeeded: false},
{operation: 'buy', succeeded: true}, 
{operation: 'buy', succeeded: false}
];

var moneSuccess = 0, mone = 0;
for(let i = 0; i < array.length; i++){
   mone++;
   if(array[i].succeeded) moneSuccess++;
   array[i].successRate = Math.floor((moneSuccess / mone) * 100);
}

console.log(array);

【讨论】:

  • 如果你想以不同的方式格式化成功率,你绝对可以做到。我这样做是为了得到和你写的一样的结果。
猜你喜欢
  • 1970-01-01
  • 2021-11-16
  • 2021-08-10
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 2017-06-23
相关资源
最近更新 更多