Node.js 与JSON文件中的数据的所有可能组合

Node.js 与JSON文件中的数据的所有可能组合,node.js,json,combinations,combinatorics,Node.js,Json,Combinations,Combinatorics,我的目标是创建一部分代码,该代码将使用JSON文件中的数据生成所有可能的组合,而不会出现重复(具有相同元素的组合,无论其顺序如何)。我的JSON文件如下所示: [ { "COLLECTION": "Assault", "WEAPON": "SG 553", "SKIN": "Tornado", "GRADE": "Consumer Grade" }, { "COLLECTION": "Assault", "WEAPON": "UMP-45", "S

我的目标是创建一部分代码,该代码将使用JSON文件中的数据生成所有可能的组合,而不会出现重复(具有相同元素的组合,无论其顺序如何)。我的JSON文件如下所示:

[
 {
   "COLLECTION": "Assault",
   "WEAPON": "SG 553",
   "SKIN": "Tornado",
   "GRADE": "Consumer Grade"
 },
 {
   "COLLECTION": "Assault",
   "WEAPON": "UMP-45",
   "SKIN": "Caramel",
   "GRADE": "Consumer Grade"
 },
 {
   "COLLECTION": "Vertigo",
   "WEAPON": "Five-SeveN",
   "SKIN": "Candy Apple ",
   "GRADE": "Industrial Grade"
 }, ...
]
组合将按以下方式生成:

[
    "COMBINATION 1":[
     {
       "COLLECTION": "Assault",
       "WEAPON": "SG 553",
       "SKIN": "Tornado",
       "GRADE": "Consumer Grade"
     },
     {
       "COLLECTION": "Assault",
       "WEAPON": "UMP-45",
       "SKIN": "Caramel",
       "GRADE": "Consumer Grade"
     },
     {
       "COLLECTION": "Assault",
       "WEAPON": "Five-SeveN",
       "SKIN": "Candy Apple ",
       "GRADE": "Industrial Grade"
     }, ...
    ],

    "COMBINATION 2":[
     {
       "COLLECTION": "Assault",
       "WEAPON": "SG 553",
       "SKIN": "Tornado",
       "GRADE": "Consumer Grade"
     },
    {
       "COLLECTION": "Aztec",
       "WEAPON": "M4A4",
       "SKIN": "Jungle Tiger",
       "GRADE": "Industrial Grade"
     },
     {
       "COLLECTION": "Aztec",
       "WEAPON": "Tec-9",
       "SKIN": "Ossified",
       "GRADE": "Mil-Spec"
     }, ...
    ],...
]
注意,在这种情况下,两种组合具有相同的元素,因此不应重复说明。这意味着,只要一个组合中有与另一个可能组合相同的元素(无论它们在哪个序列中),它就算作一个组合(每个组合将有10个元素,并且根据“皮肤”属性值不同于另一个):

还要注意的是,同一个项目可以组合出现多次(最多10次),我使用的是一个包含1500个元素的JSON文件,因此效率是关键。总而言之,最终产品应该是这样的:

这也是一个类似的问题,但不太复杂:


我试着用冒泡排序之类的方法来解决这个问题,但到目前为止还没有成功。如果你对如何实现这一点有任何想法,我很乐意听听。

虽然还不完全清楚如何按照你建议的方式确定组合,但这可能会让你走上这一步

创建一个数据结构来存储
收集
武器
皮肤
等级
的唯一元素:

// JSON sources.
const sources = [
  {
    "COLLECTION": "Assault",
    "WEAPON": "SG 553",
    "SKIN": "Tornado",
    "GRADE": "Consumer Grade"
  },
  {
    "COLLECTION": "Assault",
    "WEAPON": "UMP-45",
    "SKIN": "Caramel",
    "GRADE": "Consumer Grade"
  },
  {
    "COLLECTION": "Vertigo",
    "WEAPON": "Five-SeveN",
    "SKIN": "Candy Apple ",
    "GRADE": "Industrial Grade"
  },
]

// Create storage for the sources. Use sets to prevent duplicates.
const map = new Map([
  ['COLLECTION', new Set()],
  ['WEAPON', new Set()],
  ['SKIN', new Set()],
  ['GRADE', new Set()]
])

// Load each source into the map.
sources.forEach((source) => {
  Object.keys(source).forEach((key) => {
    const set = map.get(key)
    set.add(source[key])
  })
})

console.log(map)
输出:

Map {
  'COLLECTION' => Set { 'Assault', 'Vertigo' },
  'WEAPON' => Set { 'SG 553', 'UMP-45', 'Five-SeveN' },
  'SKIN' => Set { 'Tornado', 'Caramel', 'Candy Apple ' },
  'GRADE' => Set { 'Consumer Grade', 'Industrial Grade' } }
通过使用嵌套循环迭代,从贴图集生成所有组合:

// Store the generated combinations.
const combinations = []

// Generate all combinations.
for (const collection of map.get('COLLECTION')) {
  for (const weapon of map.get('WEAPON')) {
    for (const skin of map.get('SKIN')) {
      for (const grade of map.get('GRADE')) {
        combinations.push({
          'COLLECTION': collection,
          'WEAPON': weapon,
          'SKIN': skin,
          'GRADE': grade,
        })
      }
    }
  }
}

console.log(combinations.length) // 36

是的,这确实有点帮助。然而,我正在寻找一种算法,它不会与数据本身进行组合,而是将所有可能的列表(每个组合10项)组合到一个数组/对象中(没有重复项)。请注意,同一项可以多次(最多10次)出现在组合中,但两个组合不能具有完全相同的元素,无论其位置或顺序如何。无论如何,谢谢你的帮助:)
// Store the generated combinations.
const combinations = []

// Generate all combinations.
for (const collection of map.get('COLLECTION')) {
  for (const weapon of map.get('WEAPON')) {
    for (const skin of map.get('SKIN')) {
      for (const grade of map.get('GRADE')) {
        combinations.push({
          'COLLECTION': collection,
          'WEAPON': weapon,
          'SKIN': skin,
          'GRADE': grade,
        })
      }
    }
  }
}

console.log(combinations.length) // 36