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()
去除小数点。一旦完成,我们只需将百分比符号连接到数字的末尾,使其成为所需格式的字符串。
这些是我完成此任务的步骤:
- 从第一项到当前项获取数组项
slice(0,i+1)
- 仅映射到
succeeded
属性 值 map(f => f.succeeded)
- 添加值(第 1 步和第 2 步)
reduce((a,b) => a + b, 0)
- 除以项目数
… / (i + 1)
- 乘以 100 并截去小数
Math.floor(… * 100)
- 连接百分号
… + "%"
这里把它全部放在一起并写成一个可重用的函数:
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%" }
]
*/
我有以下数组:
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()
去除小数点。一旦完成,我们只需将百分比符号连接到数字的末尾,使其成为所需格式的字符串。
这些是我完成此任务的步骤:
- 从第一项到当前项获取数组项
slice(0,i+1)
- 仅映射到
succeeded
属性 值map(f => f.succeeded)
- 添加值(第 1 步和第 2 步)
reduce((a,b) => a + b, 0)
- 除以项目数
… / (i + 1)
- 乘以 100 并截去小数
Math.floor(… * 100)
- 连接百分号
… + "%"
这里把它全部放在一起并写成一个可重用的函数:
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%" }
]
*/