如何从对象元素中获取不重复的数组

3

我有一个包含一些组的对象(以示例为例)。每个组对象都包含一个 header id 和多个 trigger ids。 我想获取所有组的触发器的数组,且不重复。

例如:

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

目前,我是这样做的:

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

这给我以下结果:[[10,11],[11,17]] 我的计划是获得类似这样的结果:[10,11,17]。它们不必排序,但重复项(在本例中为11)必须被删除。有没有快速的方法来实现?否则,我将循环遍历此数组,然后连接到新数组,但我认为有更快,更好的解决方案。
3个回答

8

这里有一行代码使用 Set .flatMap() 方法。

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)


我这边有个小补充,因为我无法访问最新的ECMAScript。 我仍在使用ES6,但是你的答案给了我足够的建议来做一个小的解决方法。虽然很丑陋,但它能用。 所以如果有人需要这个答案,但是针对ES6,这里是代码: const triggers = [...new Set([].concat.apply([], Array.from(groups, x => x.trigger)))]; - Relentless

3
这里有一个使用 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()))
)


0
使用您代码中的函数Array.from,我无法使其按照您所说的工作。
顺便说一下,我有这个片段,请看看它是否有帮助:
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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接