Khalid Mohammed
Khalid Mohammed

Reputation: 463

sum value and remove duplicates in List

I have this list and want to sum value and remove duplicates in List

1 - check of productName

2 - sum NumberOfItems if productName equals

For Example :

"Orders":[
    {
        "productName":"Apple",
        "NumberOfItems":"5"
    },
    {
        "productName":"Orange",
        "NumberOfItems":"2"
    },
    {
        "productName":"Egg",
        "NumberOfItems":"5"
    },
    {
        "productName":"Apple",
        "NumberOfItems":"3"
    },
    {
        "productName":"Orange",
        "NumberOfItems":"4"
    },
    {
        "productName":"Egg",
        "NumberOfItems":"9"
    },
]

The result I need look like this result : (Sum Depend on productName)

"Orders":[
    {
        "productName":"Apple",
        "NumberOfItems":"8"
    },
    {
        "productName":"Orange",
        "NumberOfItems":"6"
    },
    {
        "productName":"Egg",
        "NumberOfItems":"14"
    },
]

Upvotes: 2

Views: 857

Answers (2)

k n
k n

Reputation: 26

Notice: This code has 2 loop which means slower. Igor Kharakhordin answered smarter one, but may be difficult for those who ask this question.(since he is doing two things at once.) Basically I am doing same thing.

String string = await rootBundle.loadString("asset/data/Orders.json");
  Map orders = jsonDecode(string);
  List orderList = orders["Orders"];

  Map<String,int> sums = {};

  for(int i = 0 ; i < orderList.length; i++){
    dynamic item = orderList[i];
    if(sums.containsKey(item["productName"])){
      sums[item["productName"]] += int.parse(item["NumberOfItems"]);
    }
    else{
      sums[item["productName"]] = int.parse(item["NumberOfItems"]);
    }
  }

  List sumList = [];
  sums.forEach((key,value)=> 
      sumList.add({
      "productName":key,
      "NumberOfItems":value.toString()
    })
  );

  Map result = {
    "Orders":sumList
  };

  print(jsonEncode(result));

Result

{
    "Orders": [
        {
            "productName": "Apple",
            "NumberOfItems": "8"
        },
        {
            "productName": "Orange",
            "NumberOfItems": "6"
        },
        {
            "productName": "Egg",
            "NumberOfItems": "14"
        }
    ]
}

Upvotes: 1

Igor Kharakhordin
Igor Kharakhordin

Reputation: 9873

final orders = data["Orders"] as List;
final mapped = orders.fold<Map<String, Map<String, dynamic>>>({}, (p, v) {
  final name = v["productName"];

  if (p.containsKey(name)) {
    p[name]["NumberOfItems"] += int.parse(v["NumberOfItems"]);
  } else {
    p[name] = {
      ...v,
      "NumberOfItems": int.parse(v["NumberOfItems"])
    };
  }

  return p;
});

final newData = {
  ...data,
  "Orders": mapped.values,
};

print(newData);

Result is:

{Orders: ({productName: Apple, NumberOfItems: 8}, {productName: Orange, NumberOfItems: 6}, {productName: Egg, NumberOfItems: 14})}

Upvotes: 1

Related Questions