JavaScript 中的数组中的每个对象添加成功率

Adding success rate to each object in an array in JavaScript

我有以下数组:

 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%}
]

希望对您有所帮助:
如果你想在一个对象中创建一个新的 属性,你需要按照以下步骤做:

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);

没有什么是我们用几个简单的数组方法无法完成的——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%" }
      ]
*/