admin管理员组

文章数量:1022415

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.

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.

Share Improve this question asked Jun 25, 2020 at 16:32 RelentlessRelentless 889 bronze badges
Add a ment  | 

3 Answers 3

Reset to default 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)

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()))
)

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);

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.

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.

Share Improve this question asked Jun 25, 2020 at 16:32 RelentlessRelentless 889 bronze badges
Add a ment  | 

3 Answers 3

Reset to default 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)

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()))
)

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);

本文标签: javascriptHow to get an array without duplicates from object elementsStack Overflow