首页 > 解决方案 > 如何从数组中删除子数组中具有相同元素的所有组合?

问题描述

我有这个数组

[[1,2,3],[4,1,6],[1,3,2],[1,2,4],[3,1,2],[4,6,1],[9,9,9]]

我想要一个这样做的功能:

[[1,2,3],[4,1,6],[1,2,4],[9,9,9]].

此函数删除所有具有相同值的子数组。

我想过这样的过滤器

.filter(el => el.filter(value => array2.includes(value)))

但我不认为它会起作用。

PS:我使用 node.js

编辑:奇怪的是,你的许多答案都适用于这个例子,但在我真正的程序中不起作用......事实上,我使用的是对象而不是数字。像这样:[[obj,obj,obj],[obj,obj,obj],[obj,obj,obj]]。但我不知道为什么它适用于数字而不是对象......

EDIT2:我现在给出最小的例子,这个对象:

请注意,实际数组可以有 20,000 个项目

  [
      [
        { name: 'Dofawa', item_type: 'Dofus', level: 6 },
        {
          name: 'Dofus Cawotte',
          item_type: 'Dofus',
          level: 6
        },
        {
          name: 'Dofus Kaliptus',
          item_type: 'Dofus',
          level: 6
        }
      ],
      [
        { name: 'Dofawa', item_type: 'Dofus', level: 6 },
        {
          name: 'Dofus Emeraude',
          item_type: 'Dofus',
          level: 6
        },
        {
          name: 'Dofus Ocre',
          item_type: 'Dofus',
          level: 6
        }
      ],
      [
        { name: 'Dofawa', item_type: 'Dofus', level: 6 },
        {
          name: 'Dofus Kaliptus',
          item_type: 'Dofus',
          level: 6
        },
        {
          name: 'Dofus Cawotte',
          item_type: 'Dofus',
          level: 6
        }
      ],
      [
        {
          name: 'Dofus Cawotte',
          item_type: 'Dofus',
          level: 6
        },
        {
          name: 'Dofus Kaliptus',
          item_type: 'Dofus',
          level: 6
        },
        { name: 'Dofawa', item_type: 'Dofus', level: 6 }
      ]
  ]

应该给这个对象:

  [
      [
        { name: 'Dofawa', item_type: 'Dofus', level: 6 },
        {
          name: 'Dofus Cawotte',
          item_type: 'Dofus',
          level: 6
        },
        {
          name: 'Dofus Kaliptus',
          item_type: 'Dofus',
          level: 6
        }
      ],
      [
        { name: 'Dofawa', item_type: 'Dofus', level: 6 },
        {
          name: 'Dofus Emeraude',
          item_type: 'Dofus',
          level: 6
        },
        {
          name: 'Dofus Ocre',
          item_type: 'Dofus',
          level: 6
        }
      ]
  ]

标签: javascriptarraysnode.js

解决方案


从技术上讲,它可以通过创建一个哈希表来解决,在该哈希表中,您只将唯一数组{}作为键添加到一个空对象中。可以通过首先对子数组进行排序并添加为对象的键来创建唯一值。最后,您可以Object.values()从对象中获取值。

基于这个想法,我想这对你有用:

const array = [[1,2,3],[4,1,6],[1,3,2],[1,2,4],[3,1,2],[4,6,1],[9,9,9]];
const result = {};
array.forEach(a => {
  const t = Array.from(a).sort((a,b) => a - b);
  if (!result[t]) result[t] = a;
});

console.log(Object.values(result));

Object.values()文档:

Object.values() 方法返回给定对象自己的可枚举属性值的数组,其顺序与 for...in 循环提供的顺序相同(不同之处在于 for-in 循环枚举原型链中的属性以及)。

我希望这有帮助!


推荐阅读