Сумма структуры в массиве - PullRequest
2 голосов
/ 05 декабря 2011

Я нахожусь в процессе составления корзины покупок, я храню данные корзины в массиве, внутри массива есть структура, которая содержит информацию об отдельных продуктах.Мне нужно получить сумму столбца totalprice в структуре, пожалуйста, посмотрите мой дамп ниже, я попытался

<cfset carTotal = ArraySum(session.mycart[ "totalPrice" ])>, но это вызывает ошибку: «значение totalprice не может быть преобразовано в число»?Это потому, что я использую массив в структуре?

Буду признателен за любую помощь, спасибо.

Shopping Cart Array

Ответы [ 4 ]

5 голосов
/ 05 декабря 2011

Если бы mycart был объектом Query, это был бы простой ArraySum(mycart.totalPrice)

Поскольку это массив структур, вы должны сами его зациклить, что все еще довольно просто:

<cfset sum = 0>
<cfloop array="#session.mycart#" index="item">
    <cfset sum += item.totalPrice>
</cfloop>

<cfdump var="#sum#">

Не забудьте использовать PrecisionEvaluate(), когда вам нужна полная точность.

4 голосов
/ 05 декабря 2011

Поскольку это массив, вам придется зацикливаться самостоятельно, отслеживая сумму.

<cfset cartTotal = 0 />

<cfloop array=#session.mycart# index="i">
    <cfset cartTotal += i.totalPrice /> 
</cfloop>

<cfdump var="#cartTotal#" />
2 голосов
/ 18 декабря 2012

В Coldfusion 10 или Railo 4 вы можете использовать функцию уменьшения из Underscore.cfc :

_ = new Underscore();

cartTotal = _.reduce(session.mycart, function(total, item){
   return total + item.TotalPrice;
}, 0);

уменьшение - этообычная функция высшего порядка, которая «сводит» набор значений к одному значению.В этом случае мы «снижаем» цену всех предметов в коллекции до единой суммы.

Использование понятной функции, такой как reduce, вместо пользовательского решения дает более читабельный код.

Примечание: я написал Underscore.cfc

1 голос
/ 16 августа 2018

В дополнение к ответу Русса, в Coldfusion 11 или Lucee вы можете просто сделать arrayReduce().Больше нет необходимости подчеркивать.

cartTotal = arrayReduce(session.mycart, function(total, item){
   return total + item.TotalPrice;
}, 0);
...