0

我正在尝试使用reduce()javascript 中的函数聚合数据(类似于这个问题):

HTML

Product 1: <button id="product1">Add one</button>
Product 2: <button id="product2">Add one</button>

JS

$('button').on('click', function() {
            var pid = $(this).attr('id');

            cart[cart.length] = {id:pid, qty:1}

            var result = cart.reduce(function(res, obj) {
                    if (!(obj.id in res))
                        res.__array.push(res[obj.id] = obj);
                    else {
                        res[obj.id].qty += obj.qty;
                    }
                    return res;
                }, {__array:[]})

            console.log(result)
    });
});

我无法使其工作,因为返回的数组不包含qty数据。例如:

Object {__array: Array[1], product1: Object}
Object {__array: Array[1], product1: Object}
Object {__array: Array[2], product1: Object, product2: Object}

我正在寻找的结果更像是:

Object {product1: 1}   //click on product1, quantity = 1
Object {product1: 2}   //click on product1 again, quantity = 1 + 1 = 2
Object {product1: 2, product2: 1}  //click on product2

我错过了什么?

http://jsfiddle.net/C4WuG/4/

4

3 回答 3

0

这不能解决您的问题reduce,但reduce不是正确的工具。我可以为此建议您采用不同的方法吗?cart这里不是每次添加产品时循环整个,我们只是保持每次添加的计数同步。

在这里,我假设您一次添加一个产品,但product.qty如果需要,您可以增加一个。

http://jsfiddle.net/C4WuG/6/

var cart = [], count = {};

$(document).ready(function () {

    $('button').on('click', function () {
        var pid = $(this).attr('id');

        cart.push({
            id: pid,
            qty: 1
        });

        count[pid] = (count[pid] || 0) + 1;

        console.log(count);
    });
});
于 2013-04-20T06:24:50.670 回答
0

使用.reduce()的解决方案,我认为这不是最好的方法

var cart = new Array();

$(document).ready(function(){

    $('button').on('click', function() {
        var pid = $(this).attr('id');

        cart[cart.length] = {id:pid, qty:1}

        var result = cart.reduce(function(res, obj) {
            if(res.__array){
                res = {};
            }

            if(!res[obj.id]){
                res[obj.id] = {
                    qty: 0
                }
            }

            res[obj.id].qty += obj.qty;

            return res;
        }, {__array:[]})

        console.log(result)
    });
});

演示:小提琴

或者

一个更简单的使用.forEach()

var cart = new Array();

$(document).ready(function(){

    $('button').on('click', function() {
        var pid = $(this).attr('id');

        cart[cart.length] = {id:pid, qty:1}

        var result = {};
        cart.forEach(function(obj, index){
            if(!result[obj.id]){
                result[obj.id] = { qty: 0 }
            }
            result[obj.id].qty += obj.qty;
        });

        console.log(result)
    });
});

演示:小提琴

于 2013-04-20T06:27:25.347 回答
0

如果你想要输出喜欢Object {product1: 2, product2: 1}和使用reduce方法,试试下面。它将初始值传递为{}

reduce 方法的语法是这样的

[].reduce(
   function( previousValue, currentValue, index,  array ){},
   initialValue 
);

我们的解决方案是

var cart = [];

$(document).ready(function(){

     $('button').on('click', function() {

            cart.push( { id:$(this).attr('id'), qty:1 } );

            var result = cart.reduce(function(res, obj) {

                if (!(obj.id in res )) {
                    res[obj.id] = 0
                }     

                return ( res[obj.id] += obj.qty ) && res ; 

            }, {} )

            console.log( result )
    });
});

和小提琴http://jsfiddle.net/C4WuG/8/

于 2013-04-20T06:44:15.433 回答