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

标签 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 }
      ]
  ]

应该给这个对象:
  [
      [
        { 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
        }
      ]
  ]

最佳答案

通过使用 aaray 对象并且此对象具有相同的键顺序,您可以将每个对象作为单个 JSON字符串并对JSON数组进行排序并将此字符串连接到单个字符串并将此字符串作为检查唯一性的值 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);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 如何从数组中删除子数组中具有相同元素的所有组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59330549/

相关文章:

javascript - 如何根据该json数组中的特定属性和angular js中其他下拉列表的ng-model值过滤ng-repeat中的数组

javascript - 如何使用 draggable 和 droppable 将 <li> 附加到 <ul> ?

javascript - 没有效果的 CSS 属性,由 js getComputedStyle() 读取

javascript - Mithril.js:如果 View 使用子组件,则排序数据不会重新呈现

javascript - 如何在数组数组中找到元素的索引?

javascript - 两个数组相等测试

node.js - 如何在Nodejs中将缓冲区转换为流

javascript - HTML5/JS - 启动多个 webworker

node.js - 更新具有数组和对象键的嵌套对象是动态的

javascript - 防止 browserify 包含模块的依赖项