dota2pro
dota2pro

Reputation: 7856

How to get unique an array of objects back from a complex an array of objects?

How can I get unique values from this input JSON array on field input[i].user

I can write a for loop but wanted to know if there is a shorter way using filter/set etc ? Thanks

const input = [{
  "id": 133557,
  "user": "bcasey1",
  "userfullname": "Bertha Casey",
  "commentTypeId": 2,
  "annotationPrimaryId": 141614,
  "comment": "Red color on ravioli is not true, fix",
  "deleted": false,
  "historyno": "133557-0",
  "timestamp": "Tue Apr 24 10:40:42 CDT 2018",
  "type": "rectangle"
}, {
  "id": 134038,
  "user": "admin",
  "userfullname": "Administrator Administrator",
  "commentTypeId": 1,
  "annotationPrimaryId": 142286,
  "comment": "test123",
  "deleted": false,
  "historyno": "134038-0",
  "timestamp": "Mon Jul 8 22:15:18 CDT 2019",
  "type": "rectangle"
}, {
  "id": 134039,
  "user": "admin",
  "userfullname": "Administrator Administrator",
  "commentTypeId": 2,
  "annotationPrimaryId": 142287,
  "comment": "test234",
  "deleted": false,
  "historyno": "134039-0",
  "timestamp": "Mon Jul 8 22:15:35 CDT 2019",
  "type": "rectangle"
}, {
  "id": 134112,
  "user": "admin",
  "userfullname": "Administrator Administrator",
  "commentTypeId": 3,
  "annotationPrimaryId": 142361,
  "comment": "sadasdasd",
  "deleted": false,
  "historyno": "134112-0",
  "timestamp": "Wed Jul 17 13:03:55 CDT 2019",
  "type": "rectangle"
}, {
  "id": 134112,
  "user": "admin",
  "userfullname": "Administrator Administrator",
  "commentTypeId": 0,
  "annotationPrimaryId": 142370,
  "comment": "sadasdasd s",
  "deleted": false,
  "historyno": "134112-1",
  "timestamp": "Wed Jul 17 15:09:48 CDT 2019",
  "type": "rectangle"
}, {
  "id": 134113,
  "user": "admin",
  "userfullname": "Administrator Administrator",
  "commentTypeId": 4,
  "annotationPrimaryId": 142362,
  "comment": "sadasdasd edited #4",
  "deleted": false,
  "historyno": "134113-0",
  "timestamp": "Wed Jul 17 13:16:39 CDT 2019",
  "type": "rectangle"
}, {
  "id": 134114,
  "user": "admin",
  "userfullname": "Administrator Administrator",
  "commentTypeId": 0,
  "annotationPrimaryId": 142363,
  "comment": "sadasdasd edited #5",
  "deleted": false,
  "historyno": "134114-0",
  "timestamp": "Wed Jul 17 13:20:06 CDT 2019",
  "type": "rectangle"
}, {
  "id": 134114,
  "user": "admin",
  "userfullname": "Administrator Administrator",
  "commentTypeId": 0,
  "annotationPrimaryId": 142365,
  "comment": "sadasdasd edited #6",
  "deleted": false,
  "historyno": "134114-1",
  "timestamp": "Wed Jul 17 13:36:53 CDT 2019",
  "type": "rectangle"
}, {
  "id": 134114,
  "user": "admin",
  "userfullname": "Administrator Administrator",
  "commentTypeId": 0,
  "annotationPrimaryId": 142366,
  "comment": "sadasdasd edited #7",
  "deleted": false,
  "historyno": "134114-2",
  "timestamp": "Wed Jul 17 13:46:36 CDT 2019",
  "type": "rectangle"
}, {
  "id": 134115,
  "user": "admin",
  "userfullname": "Administrator Administrator",
  "commentTypeId": 2,
  "annotationPrimaryId": 142367,
  "comment": "eertet",
  "deleted": false,
  "historyno": "134115-0",
  "timestamp": "Wed Jul 17 14:50:03 CDT 2019",
  "type": "rectangle"
}, {
  "id": 134118,
  "user": "admin",
  "userfullname": "Administrator Administrator",
  "commentTypeId": 3,
  "annotationPrimaryId": 142371,
  "comment": "a",
  "deleted": false,
  "historyno": "134118-0",
  "timestamp": "Wed Jul 17 15:09:58 CDT 2019",
  "type": "rectangle"
}];

const expectedOutput = [{
  "user": "bcasey1",
  "userfullname": "Bertha Casey"
}, {
  "user": "admin",
  "userfullname": "Administrator Administrator",
}];

console.log('expectedOutput', expectedOutput);

Upvotes: 2

Views: 241

Answers (4)

Pointy
Pointy

Reputation: 413712

You can use a combination of Object.keys() and .reduce():

const uniqueNames = Object.keys(input.reduce((names, obj) => (names[obj.user] = 1, names), {}));

The .reduce() operation creates an object whose property names are the "user" property values from the objects in the original array. The Object.keys() call then creates an array of those property names.

If you want the "full name" values, you can replace 1 by that and skip the Object.keys() call, or use Object.entries() to get an array of user and full names:

const usersAndNames = Object.entries(input.reduce((users, obj) => (obj[users] = obj.userfullname, obj), {}));

Upvotes: 0

Wilhelmina Lohan
Wilhelmina Lohan

Reputation: 3033

Alternative, you could map to the simplified "user", "userfullname" object then filter on where the index is the same as the result of findIndex where "user" is equal (a way to unique for javascript arrays)

const input = [{
  "id": 133557,
  "user": "bcasey1",
  "userfullname": "Bertha Casey",
  "commentTypeId": 2,
  "annotationPrimaryId": 141614,
  "comment": "Red color on ravioli is not true, fix",
  "deleted": false,
  "historyno": "133557-0",
  "timestamp": "Tue Apr 24 10:40:42 CDT 2018",
  "type": "rectangle"
}, {
  "id": 134038,
  "user": "admin",
  "userfullname": "Administrator Administrator",
  "commentTypeId": 1,
  "annotationPrimaryId": 142286,
  "comment": "test123",
  "deleted": false,
  "historyno": "134038-0",
  "timestamp": "Mon Jul 8 22:15:18 CDT 2019",
  "type": "rectangle"
}, {
  "id": 134039,
  "user": "admin",
  "userfullname": "Administrator Administrator",
  "commentTypeId": 2,
  "annotationPrimaryId": 142287,
  "comment": "test234",
  "deleted": false,
  "historyno": "134039-0",
  "timestamp": "Mon Jul 8 22:15:35 CDT 2019",
  "type": "rectangle"
}, {
  "id": 134112,
  "user": "admin",
  "userfullname": "Administrator Administrator",
  "commentTypeId": 3,
  "annotationPrimaryId": 142361,
  "comment": "sadasdasd",
  "deleted": false,
  "historyno": "134112-0",
  "timestamp": "Wed Jul 17 13:03:55 CDT 2019",
  "type": "rectangle"
}, {
  "id": 134112,
  "user": "admin",
  "userfullname": "Administrator Administrator",
  "commentTypeId": 0,
  "annotationPrimaryId": 142370,
  "comment": "sadasdasd s",
  "deleted": false,
  "historyno": "134112-1",
  "timestamp": "Wed Jul 17 15:09:48 CDT 2019",
  "type": "rectangle"
}, {
  "id": 134113,
  "user": "admin",
  "userfullname": "Administrator Administrator",
  "commentTypeId": 4,
  "annotationPrimaryId": 142362,
  "comment": "sadasdasd edited #4",
  "deleted": false,
  "historyno": "134113-0",
  "timestamp": "Wed Jul 17 13:16:39 CDT 2019",
  "type": "rectangle"
}, {
  "id": 134114,
  "user": "admin",
  "userfullname": "Administrator Administrator",
  "commentTypeId": 0,
  "annotationPrimaryId": 142363,
  "comment": "sadasdasd edited #5",
  "deleted": false,
  "historyno": "134114-0",
  "timestamp": "Wed Jul 17 13:20:06 CDT 2019",
  "type": "rectangle"
}, {
  "id": 134114,
  "user": "admin",
  "userfullname": "Administrator Administrator",
  "commentTypeId": 0,
  "annotationPrimaryId": 142365,
  "comment": "sadasdasd edited #6",
  "deleted": false,
  "historyno": "134114-1",
  "timestamp": "Wed Jul 17 13:36:53 CDT 2019",
  "type": "rectangle"
}, {
  "id": 134114,
  "user": "admin",
  "userfullname": "Administrator Administrator",
  "commentTypeId": 0,
  "annotationPrimaryId": 142366,
  "comment": "sadasdasd edited #7",
  "deleted": false,
  "historyno": "134114-2",
  "timestamp": "Wed Jul 17 13:46:36 CDT 2019",
  "type": "rectangle"
}, {
  "id": 134115,
  "user": "admin",
  "userfullname": "Administrator Administrator",
  "commentTypeId": 2,
  "annotationPrimaryId": 142367,
  "comment": "eertet",
  "deleted": false,
  "historyno": "134115-0",
  "timestamp": "Wed Jul 17 14:50:03 CDT 2019",
  "type": "rectangle"
}, {
  "id": 134118,
  "user": "admin",
  "userfullname": "Administrator Administrator",
  "commentTypeId": 3,
  "annotationPrimaryId": 142371,
  "comment": "a",
  "deleted": false,
  "historyno": "134118-0",
  "timestamp": "Wed Jul 17 15:09:58 CDT 2019",
  "type": "rectangle"
}];

const simpleInput = input.map(({ user, userfullname }) => ({ user, userfullname }));

const filteredInput = simpleInput.filter((user, i, a) => i == a.findIndex(u => u.user == user.user));

console.log(filteredInput)

Upvotes: 2

User863
User863

Reputation: 20039

Using reduce() and Object.assign()

const input = [{"id":133557,"user":"bcasey1","userfullname":"Bertha Casey","commentTypeId":2,"annotationPrimaryId":141614,"comment":"Red color on ravioli is not true, fix","deleted":false,"historyno":"133557-0","timestamp":"Tue Apr 24 10:40:42 CDT 2018","type":"rectangle"},{"id":134038,"user":"admin","userfullname":"Administrator Administrator","commentTypeId":1,"annotationPrimaryId":142286,"comment":"test123","deleted":false,"historyno":"134038-0","timestamp":"Mon Jul 8 22:15:18 CDT 2019","type":"rectangle"},{"id":134039,"user":"admin","userfullname":"Administrator Administrator","commentTypeId":2,"annotationPrimaryId":142287,"comment":"test234","deleted":false,"historyno":"134039-0","timestamp":"Mon Jul 8 22:15:35 CDT 2019","type":"rectangle"},{"id":134112,"user":"admin","userfullname":"Administrator Administrator","commentTypeId":3,"annotationPrimaryId":142361,"comment":"sadasdasd","deleted":false,"historyno":"134112-0","timestamp":"Wed Jul 17 13:03:55 CDT 2019","type":"rectangle"},{"id":134112,"user":"admin","userfullname":"Administrator Administrator","commentTypeId":0,"annotationPrimaryId":142370,"comment":"sadasdasd s","deleted":false,"historyno":"134112-1","timestamp":"Wed Jul 17 15:09:48 CDT 2019","type":"rectangle"},{"id":134113,"user":"admin","userfullname":"Administrator Administrator","commentTypeId":4,"annotationPrimaryId":142362,"comment":"sadasdasd edited #4","deleted":false,"historyno":"134113-0","timestamp":"Wed Jul 17 13:16:39 CDT 2019","type":"rectangle"},{"id":134114,"user":"admin","userfullname":"Administrator Administrator","commentTypeId":0,"annotationPrimaryId":142363,"comment":"sadasdasd edited #5","deleted":false,"historyno":"134114-0","timestamp":"Wed Jul 17 13:20:06 CDT 2019","type":"rectangle"},{"id":134114,"user":"admin","userfullname":"Administrator Administrator","commentTypeId":0,"annotationPrimaryId":142365,"comment":"sadasdasd edited #6","deleted":false,"historyno":"134114-1","timestamp":"Wed Jul 17 13:36:53 CDT 2019","type":"rectangle"},{"id":134114,"user":"admin","userfullname":"Administrator Administrator","commentTypeId":0,"annotationPrimaryId":142366,"comment":"sadasdasd edited #7","deleted":false,"historyno":"134114-2","timestamp":"Wed Jul 17 13:46:36 CDT 2019","type":"rectangle"},{"id":134115,"user":"admin","userfullname":"Administrator Administrator","commentTypeId":2,"annotationPrimaryId":142367,"comment":"eertet","deleted":false,"historyno":"134115-0","timestamp":"Wed Jul 17 14:50:03 CDT 2019","type":"rectangle"},{"id":134118,"user":"admin","userfullname":"Administrator Administrator","commentTypeId":3,"annotationPrimaryId":142371,"comment":"a","deleted":false,"historyno":"134118-0","timestamp":"Wed Jul 17 15:09:58 CDT 2019","type":"rectangle"}];

const expectedOutput = input.reduce((a, o) => Object.assign(a, {
  [o.user]: {
    user: o.user,
    userfullname: o.userfullname
  }
}), {});

console.log('expectedOutput', Object.values(expectedOutput));

Upvotes: 4

MR0
MR0

Reputation: 164

I dont understand well your question, but maybe this works for you:

let users_id = input.map( d => d.id );

// --> [133557,133558,...]

Upvotes: 2

Related Questions