如何从数组中删除子数组中具有相同元素的所有组合?

bos*_*972 5 javascript arrays node.js

我有这个数组

[[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 }
      ]
  ]
Run Code Online (Sandbox Code Playgroud)

应该给这个对象:

  [
      [
        { 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
        }
      ]
  ]
Run Code Online (Sandbox Code Playgroud)

Nin*_*olz 2

通过使用 aaray 对象,并且该对象具有相同的键顺序,您可以将每个对象作为单个JSON字符串获取,并对 JSON 数组进行排序,然后将此字符串连接到单个字符串,并将该字符串作为值来检查唯一性A Set

const
    normalize = v => v.map(o => JSON.stringify(o)).sort().join('|'),
    filterWithSet = s => v => (n => !s.has(n) && s.add(n))(normalize(v)),
    data = [[{ 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 }]],
    unique = data.filter(filterWithSet(new Set));

console.log(unique);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)