JSON 文件中数据的所有可能组合
All possible combinations with data from JSON file
我的目标是创建一部分代码,使用 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 个元素,并且根据"SKIN" 属性值):
[
"COMBINATION 1":[
{
"COLLECTION": "Vertigo",
"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": "Five-SeveN",
"SKIN": "Candy Apple ",
"GRADE": "Industrial Grade"
},
{
"COLLECTION": "Vertigo",
"WEAPON": "SG 553",
"SKIN": "Tornado",
"GRADE": "Consumer Grade"
},
{
"COLLECTION": "Assault",
"WEAPON": "UMP-45",
"SKIN": "Caramel",
"GRADE": "Consumer Grade"
},...
],...
另请注意,同一项目可以多次出现在组合中(最多 10 次),而且我正在处理一个包含大约 1500 个元素的 JSON 文件,因此效率是关键。总而言之,最终产品应如下所示:
https://textuploader.com/1du6o
这也是一个类似的问题,但没那么复杂:
Permutations in JavaScript?
我试过用冒泡排序等方法解决这个问题,但到目前为止还没有成功。如果您对如何实现这一点有任何想法,我很乐意听取他们的意见。
虽然还不完全清楚如何按照您建议的方式确定组合,但这可能会帮助您实现目标。
创建一个数据结构来存储 collection
、weapon
、skin
和 grade
的唯一元素:
// 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
我的目标是创建一部分代码,使用 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 个元素,并且根据"SKIN" 属性值):
[
"COMBINATION 1":[
{
"COLLECTION": "Vertigo",
"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": "Five-SeveN",
"SKIN": "Candy Apple ",
"GRADE": "Industrial Grade"
},
{
"COLLECTION": "Vertigo",
"WEAPON": "SG 553",
"SKIN": "Tornado",
"GRADE": "Consumer Grade"
},
{
"COLLECTION": "Assault",
"WEAPON": "UMP-45",
"SKIN": "Caramel",
"GRADE": "Consumer Grade"
},...
],...
另请注意,同一项目可以多次出现在组合中(最多 10 次),而且我正在处理一个包含大约 1500 个元素的 JSON 文件,因此效率是关键。总而言之,最终产品应如下所示: https://textuploader.com/1du6o
这也是一个类似的问题,但没那么复杂: Permutations in JavaScript?
我试过用冒泡排序等方法解决这个问题,但到目前为止还没有成功。如果您对如何实现这一点有任何想法,我很乐意听取他们的意见。
虽然还不完全清楚如何按照您建议的方式确定组合,但这可能会帮助您实现目标。
创建一个数据结构来存储 collection
、weapon
、skin
和 grade
的唯一元素:
// 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