检查 JavaScript 对象数组中的值是否为负数。

3

我有一个获取图表数据的代码:

function createData(data) {
    if ($("#options").val() == 1) {
        var totalTopProfit = eval(data.data[0].profit.replace(/[^\d\.]/g, '') + '+' + data.data[1].profit.replace(/[^\d\.]/g, '') + '+' + data.data[2].profit.replace(/[^\d\.]/g, '') + '+' + data.data[3].profit.replace(/[^\d\.]/g, '')).toFixed(2);
        var totalProfit = eval(data.others.replace(/[^\d\.]/g, ''));
        var othersProfit = parseFloat(totalProfit) - totalTopProfit;

        createLegend(data, othersProfit, 1);

        var data = [{
            "company": data.data[0].company,
            "profit": data.data[0].profit,
            "percentage": parseFloat(eval((data.data[0].profit.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": data.data[1].company,
            "profit": data.data[1].profit,
            "percentage": parseFloat(eval((data.data[1].profit.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": data.data[2].company,
            "profit": data.data[2].profit,
            "percentage": parseFloat(eval((data.data[2].profit.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": data.data[3].company,
            "profit": data.data[3].profit,
            "percentage": parseFloat(eval((data.data[3].profit.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": "Others",
            "profit": numberWithCommas(othersProfit.toFixed(2)),
            "percentage": parseFloat(eval((othersProfit / totalProfit) * 100).toFixed(2))
        }];
    } else if ($("#options").val() == 2) {
        var totalTopProfit = eval(data.data[0].revenue.replace(/[^\d\.]/g, '') + '+' + data.data[1].revenue.replace(/[^\d\.]/g, '') + '+' + data.data[2].revenue.replace(/[^\d\.]/g, '') + '+' + data.data[3].revenue.replace(/[^\d\.]/g, '')).toFixed(2);
        var totalProfit = eval(data.others.replace(/[^\d\.]/g, ''));
        var othersProfit = parseFloat(totalProfit) - totalTopProfit;

        createLegend(data, othersProfit, 2);

        var data = [{
            "company": data.data[0].company,
            "profit": data.data[0].revenue,
            "percentage": parseFloat(eval((data.data[0].revenue.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": data.data[1].company,
            "profit": data.data[1].revenue,
            "percentage": parseFloat(eval((data.data[1].revenue.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": data.data[2].company,
            "profit": data.data[2].revenue,
            "percentage": parseFloat(eval((data.data[2].revenue.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": data.data[3].company,
            "profit": data.data[3].revenue,
            "percentage": parseFloat(eval((data.data[3].revenue.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": "Others",
            "profit": numberWithCommas(othersProfit.toFixed(2)),
            "percentage": parseFloat(eval((othersProfit / totalProfit) * 100).toFixed(2))
        }];
    } else if ($("#options").val() == 3) {
        var totalTopProfit = eval(data.data[0].profit.replace(/[^\d\.]/g, '') + '+' + data.data[1].profit.replace(/[^\d\.]/g, '') + '+' + data.data[2].profit.replace(/[^\d\.]/g, '') + '+' + data.data[3].profit.replace(/[^\d\.]/g, '')).toFixed(2);
        var totalProfit = eval(data.others.replace(/[^\d\.]/g, ''));
        var othersProfit = parseFloat(totalProfit) - totalTopProfit;

        createLegend(data, othersProfit, 3);

        var data = [{
            "company": data.data[0].offer,
            "profit": data.data[0].profit,
            "percentage": parseFloat(eval((data.data[0].profit.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": data.data[1].offer,
            "profit": data.data[1].profit,
            "percentage": parseFloat(eval((data.data[1].profit.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": data.data[2].offer,
            "profit": data.data[2].profit,
            "percentage": parseFloat(eval((data.data[2].profit.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": data.data[3].offer,
            "profit": data.data[3].profit,
            "percentage": parseFloat(eval((data.data[3].profit.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": "Others",
            "profit": numberWithCommas(othersProfit.toFixed(2)),
            "percentage": parseFloat(eval((othersProfit / totalProfit) * 100).toFixed(2))
        }];
    } else if ($("#options").val() == 4) {
        var totalTopProfit = eval(data.data[0].revenue.replace(/[^\d\.]/g, '') + '+' + data.data[1].revenue.replace(/[^\d\.]/g, '') + '+' + data.data[2].revenue.replace(/[^\d\.]/g, '') + '+' + data.data[3].revenue.replace(/[^\d\.]/g, '')).toFixed(2);
        var totalProfit = eval(data.others.replace(/[^\d\.]/g, ''));
        var othersProfit = parseFloat(totalProfit) - totalTopProfit;

        createLegend(data, othersProfit, 4);

        var data = [{
            "company": data.data[0].offer,
            "profit": data.data[0].revenue,
            "percentage": parseFloat(eval((data.data[0].revenue.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": data.data[1].offer,
            "profit": data.data[1].revenue,
            "percentage": parseFloat(eval((data.data[1].revenue.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": data.data[2].offer,
            "profit": data.data[2].revenue,
            "percentage": parseFloat(eval((data.data[2].revenue.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": data.data[3].offer,
            "profit": data.data[3].revenue,
            "percentage": parseFloat(eval((data.data[3].revenue.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": "Others",
            "profit": numberWithCommas(othersProfit.toFixed(2)),
            "percentage": parseFloat(eval((othersProfit / totalProfit) * 100).toFixed(2))
        }];
    } else if ($("#options").val() == 5) {
        var totalTopProfit = eval(data.data[0].profit.replace(/[^\d\.]/g, '') + '+' + data.data[1].profit.replace(/[^\d\.]/g, '') + '+' + data.data[2].profit.replace(/[^\d\.]/g, '') + '+' + data.data[3].profit.replace(/[^\d\.]/g, '')).toFixed(2);
        var totalProfit = eval(data.others.replace(/[^\d\.]/g, ''));
        var othersProfit = parseFloat(totalProfit) - totalTopProfit;

        createLegend(data, othersProfit, 5);

        var data = [{
            "company": data.data[0].advertiser,
            "profit": data.data[0].profit,
            "percentage": parseFloat(eval((data.data[0].profit.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": data.data[1].advertiser,
            "profit": data.data[1].profit,
            "percentage": parseFloat(eval((data.data[1].profit.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": data.data[2].advertiser,
            "profit": data.data[2].profit,
            "percentage": parseFloat(eval((data.data[2].profit.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": data.data[3].advertiser,
            "profit": data.data[3].profit,
            "percentage": parseFloat(eval((data.data[3].profit.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": "Others",
            "profit": numberWithCommas(othersProfit.toFixed(2)),
            "percentage": parseFloat(eval((othersProfit / totalProfit) * 100).toFixed(2))
        }];
    } else if ($("#options").val() == 6) {
        var totalTopProfit = eval(data.data[0].revenue.replace(/[^\d\.]/g, '') + '+' + data.data[1].revenue.replace(/[^\d\.]/g, '') + '+' + data.data[2].revenue.replace(/[^\d\.]/g, '') + '+' + data.data[3].revenue.replace(/[^\d\.]/g, '')).toFixed(2);
        var totalProfit = eval(data.others.replace(/[^\d\.]/g, ''));
        var othersProfit = parseFloat(totalProfit) - totalTopProfit;

        createLegend(data, othersProfit, 6);

        var data = [{
            "company": data.data[0].advertiser,
            "profit": data.data[0].revenue,
            "percentage": parseFloat(eval((data.data[0].revenue.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": data.data[1].advertiser,
            "profit": data.data[1].revenue,
            "percentage": parseFloat(eval((data.data[1].revenue.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": data.data[2].advertiser,
            "profit": data.data[2].revenue,
            "percentage": parseFloat(eval((data.data[2].revenue.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": data.data[3].advertiser,
            "profit": data.data[3].revenue,
            "percentage": parseFloat(eval((data.data[3].revenue.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
        }, {
            "company": "Others",
            "profit": numberWithCommas(othersProfit.toFixed(2)),
            "percentage": parseFloat(eval((othersProfit / totalProfit) * 100).toFixed(2))
        }];
    }
    return data;
}

问题在于当利润值为负数时,会破坏图表。现在我需要检查“profit”(“profit”:data.data [0] .profit)是否为负数,如果是,那么我需要删除所有这些具有负值利润的数据,并且只返回具有正利润的数据。
{
    "company": data.data[0].company,
    "profit": data.data[0].profit,
    "percentage": parseFloat(eval((data.data[0].profit.replace(/[^\d\.]/g, '') / totalProfit) * 100).toFixed(2))
}

有谁知道我该如何检查这个问题吗?


你确定要从数组中删除该值吗?我曾经使用过图表,每个数据点都映射到x或y轴数据,删除它们将使数据向1个索引移动。如果您能提供工作代码片段,那将非常有帮助。 - user9141233
你在data被初始化之前调用了createLegend(data, ...) - Andreas
我确定想要从数组中删除值。是的,我正在调用那个方法,为了图例,我使用这些数据值createData(data)。 - alonso05
如果这段代码按照预期工作,我建议前往CodeReview获取一些关于如何改进您的函数的反馈意见。 - Andreas
1个回答

1
我认为您可以使用JavaScript中的过滤器函数来实现这一点。
data=data.data.filter((d)=>{// as your data array is inside data object
return d.profit>=0;
})

现在,您只会得到具有正利润或零利润的数据。

既然这是图表中的数据点,你不觉得它会影响图表吗? - user9141233
我认为OP正在使用这个函数将数据返回给图表。因此,如果他在图表呈现之前对其进行过滤,则它将根据所提供的数据呈现。 - orangespark
很高兴能够帮到你 :) - orangespark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接