3

I have an object with groups (as an example). Each group object contains one header id and multiple trigger ids. I want to get an array of all the triggers of all groups without duplicates.

An example would be this:

const groups = {
  group1: { header: 9, trigger: [10,11] },
  group2: { header: 15, trigger: [11, 17] }
}

Currently, I am doing it like so:

const triggers = Array.from(groups, x => x.trigger);

This gives me the following result: [[10,11],[11,17]]

My plan is to get something like this: [10,11,17]. They don't have to be sorted but the duplicates (in this case 11) has to be removed. Is there any fast way of doing it? Otherwise I would loop through this array now and then concat to a new array but I think there is a faster and better solution.

3 Answers 3

8

Here is a one-liner using Set and .flatMap() method

const groups = {
  group1: { header: 9, trigger: [10,11] },
  group2: { header: 15, trigger: [11, 17] }
}
const triggers = [...new Set(Object.values(groups).flatMap(x=>x.trigger))]

console.log(triggers)

Sign up to request clarification or add additional context in comments.

1 Comment

Little addition from my side since I have no access to the newest ECMAScript. I am still using ES6 but your answer gave me enough advice to make a little workaround. It's ugly as hell but it works. So if anyone needs this answer but for ES6, here is the code: const triggers = [...new Set([].concat.apply([], Array.from(groups, x => x.trigger)))];
3

Here's a pretty quick way using a Set

const groups = {
  group1: { header: 9, trigger: [10,11] },
  group2: { header: 15, trigger: [11, 17] }
}

const addGroupTrigger = (triggersSet, [, group]) => {
  for (const trigger of group.trigger) {
    triggersSet.add(trigger)
  }
  return triggersSet
}

console.log(
  Array.from(Object.entries(groups).reduce(addGroupTrigger, new Set()))
)

Comments

0

Using the function Array.from as in your code, I can't make it work like you said.

Btw, I have this snippet, take a look to see if it helps:

const groups = {
  group1: { header: 9, trigger: [10,11] },
  group2: { header: 15, trigger: [11, 17] }
}
var arr = []
Object.keys(groups).forEach(function (key) {
    arr = arr.concat(groups[key].trigger);
});
console.log('Array with DUP: ', arr);
var set = new Set(arr);
arr = Array.from(set);
console.log('Array without DUP: ', arr);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.