NetPax
NetPax

Reputation: 109

Remove repeated elements from JSON and sum one column

I have an array of JSON

[
  {
    login: "LoginAAA",
    url: "someurl-aaa",
    number: 23
  },
  {
    login: "LoginBBB",
    url: "someurl-bbb",
    number: 56
  },
  {
    login: "LoginCCC",
    url: "someurl-ccc",
    number: 12
  },
  {
    login: "LoginAAA",
    url: "someurl-aaa",
    number: 46
  },
  {
    login: "LoginBBB",
    url: "someurl-bbb"
    number: 112
  },
  {
    login: "LoginCCC",
    url: "someurl-ccc",
    number: 24
  },
  {
    login: "LoginAAA",
    url: "someurl-aaa",
    number: 69
  },
  {
    login: "LoginBBB",
    url: "someurl-bbb",
    number: 168
  },
  {
    login: "LoginCCC",
    url: "someurl-ccc",
    number: 36
  }
]

and I need to leave in array only objects with unique login but I have to sum the "number" of each "login" and assign total to unique "login". Additionaly: I need entire object (with url, etc...) with summed number.

I readed How to make a JSON array unique and Array unique values but not all is clear for me at this case.

Expectation/Result

[
  {
    login: "LoginAAA",
    url: "someurl-aaa"
    number: 138
  },
  {
    login: "LoginBBB",
    url: "someurl-bbb"
    number: 336
  },
  {
    login: "LoginCCC",
    url: "someurl-ccc"
    number: 72
  }
]

Upvotes: 1

Views: 101

Answers (4)

Adeel Imran
Adeel Imran

Reputation: 13966

Suppose var data is where your array is defined. Using Array.reduce function you can do something like this.

data.reduce((acc, val) => {
 if (acc[val.login] === undefined) {
   acc[val.login] = val;
 } else {
   acc[val.login].number = acc[val.login].number + val.number
 }
 return acc;
}, {});

The result you will get from this is the following.

{
  "LoginAAA": {
    "login": "LoginAAA",
    "url": "someurl-aaa",
    "number": 253
   },
   "LoginBBB": {
     "login": "LoginBBB",
      "url": "someurl-bbb",
      "number": 616
   },
   "LoginCCC": {
     "login": "LoginCCC",
     "url": "someurl-ccc",
     "number": 132
   }
}

For further understanding you can read the MDN documentation on Array.reduce method https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

Upvotes: 0

Wajahat Qasim
Wajahat Qasim

Reputation: 70

Just a simple and es6 based answer.

let result = [];
YOUR_JSON.forEach((item, index) => {
    const temp = result.filter(e=>{return e.login === item.login});
  if(temp.length > 0){
    result[result.findIndex(e=>{return e.login ===item.login})].number += item.number;
  }
  else{
    result.push(item);
  }
});

You will get your result into result array.

[
  {
    login: "LoginAAA",
    url: "someurl-aaa"
    number: 138
  },
  {
    login: "LoginBBB",
    url: "someurl-bbb"
    number: 336
  },
  {
    login: "LoginCCC",
    url: "someurl-ccc"
    number: 72
  }
]

Upvotes: 1

Emre Kabaoglu
Emre Kabaoglu

Reputation: 13146

Try like this;

var jsonObjectArray = JSON.parse(json);
var groupArray = [];
var totalNumber = 0;
jsonObjectArray.reduce(function (tmp, item) {
    if (!tmp[item.login]) {
        tmp[item.login] = {
            number: 0,
            login: item.login
        };
        groupArray.push(tmp[item.login])
    }
    totalNumber += item.number;
    tmp[item.login].number += item.number;
    return tmp;
}, {});
var result = { groupArray : groupArray, totalNumber : totalNumber }

Output:

{
   "groupArray":[
      {
         "number":138,
         "login":"LoginAAA"
      },
      {
         "number":336,
         "login":"LoginBBB"
      },
      {
         "number":72,
         "login":"LoginCCC"
      }
   ],
   "totalNumber":546
}

Also, the json which you shared in the question is invalid. The double quotes and comma for per field are required for json properties like;

  {
    "login": "LoginAAA",
    "url": "someurl-aaa",
    "number": 23
  }

Upvotes: 0

TamirNahum
TamirNahum

Reputation: 484

You can make a new JSON object with the repeated keys. For example:

var newJSON = {};
Object.keys(oldJSON).forEach(function(k) {
    newJSON[k] = newJSON[k] || {
        url: oldJSON[k].url,
        sum: 0
    };
    newJSON[k].sum += oldJSON[sum];
});
console.log(newJSON);

I hope this is what you were looking for.

Upvotes: 0

Related Questions