如果检索到相同的数据,则处理javascript数组对象(AngularJS)

时间:2016-11-29 18:23:06

标签: angularjs

所以我正在开发一个允许用户点击供应商的模块。将有超过1项。

因此,每次用户点击特定商品的供应商时,我都会将供应商名称和价格添加到javascript数组中。

假设用户选择了所有供应商后,供应商数组将包含

vm.vendor = [
    {checked:true, name : "Vendor 1", price: 1},
    {checked:true, name : "Vendor 2", price: 2},
    {checked:true, name : "Vendor 2", price: 3},
]

我想列出供应商的总购买量。所以我想重复vm.vendor,然后列出供应商名称和总价格。

但是,在上述情况下,它将列出供应商2,2次。我怎样才能实现

vendor 1 => total price : 1,
vendor 2 => total price : 5

当用户要添加阵列中已存在的另一个供应商时,我该如何操作数组?

这是我的代码,使用户能够将供应商添加到新数组

function chooseVendor(item, vendor, index) {
vm.vendor = [];

for(var i = 0; i < vm.request_area.length; i++){
  for(var x = 0; x < vm.request_area[i].details.length; x++){
    for(var y = 0; y < vm.request_area[i].details[x].vendor_list.length; y++){
        if(vm.request_area[i].details[x].vendor_list[y].checked == true){
            vm.vendor.push(
                vm.request_area[i].details[x].vendor_list[y]
            )
        }
    }
  }
}
}

1 个答案:

答案 0 :(得分:0)

我会在推送功能之前添加一个检查以查看供应商是否已经在列表中。如果是,则添加价格而不是推送新对象。此外,您应该使用id或键来引用它们,以避免在最后一个循环中循环。

function chooseVendor(item, vendor, index) {
    vm.vendor = [];

    for(var i = 0; i < vm.request_area.length; i++){

        for(var x = 0; x < vm.request_area[i].details.length; x++){

            var vendor_list = vm.request_area[i].details[x].vendor_list;

            for(var y = 0; y < vendor_list.length; y++){

                var vendor = vm.request_area[i].details[x].vendor_list[y];

                if(vendor.checked == true){
                    var name = vendor.name;
                    var existing = vendor_list.filter(function(vendor){
                        return vendor.name == name;  //could also use an id which would probably be better
                    });

                    if(!existing){
                        //if you know the index of the vendor in the
                        //vm.vendor array, you can access directly without
                        //this loop
                        for(var z = 0; z < vm.vendor.length; z++){
                            var this_vendor = vm.vendor[z];
                            if(this_vendor.name == name) this.vendor.price += vendor.price;
                        }
                    } else {
                        vm.vendor.push(vendor)
                    }

                }

            }
        }
    }
}