javascript - 组织具有重复元素的多维数组
问题描述
我写了一个代码来帮助我快速组织我的 d&d 游戏。它基本上会生成一个input:number
居民,描述他们的种族和年龄组,一切都是随机的:
var numero = document.getElementById('numero') //INPUT:NUMBER
function encontroaleatorio1() {
var arrRaça = ['human (male)', 'human (male)', 'human (male)', 'human (female)', 'human (female)', 'human (female)', 'elf (male)', 'elf (male)', 'elf (female)', 'elf (female)', 'half-elf (male)', 'half-elf (female)', 'half-orc (male)', 'half-orc (female)', 'gnome (male)', 'gnome (female)']
var arrIdade = ['very young', 'young', 'adult', 'old']
var raça = []
var idade = []
//RANDOM (RACE AND AGE)
if (numero.value > 0) {
for (i=0; i < numero.value; i++) {
var arrRaça2 = arrRaça[Math.floor(Math.random() * arrRaça.length)]
raça.push(arrRaça2)
var arrIdade2 = arrIdade[Math.floor(Math.random() * arrIdade.length)]
idade.push(arrIdade2)
}
} else if (numero.length == 0) {
alert('Número inválido')
} else {
alert('Número inválido')
}
//SORT AND REGROUP REPEATED ELEMENTS
raça.sort()
var raça2 = []
var nrepetidos = [] //ARRAY WITH REPEATED RACES
var current = null;
var cnt = 0;
for (var i = 0; i < raça.length; i++) {
if (raça[i] != current) {
if (cnt > 0) {
raça2.push(`${cnt} ${current}`)
nrepetidos.push(cnt)
}
current = raça[i];
cnt = 1;
} else {
cnt++;
}
}
if (cnt > 0) {
raça2.push(`${cnt} ${current}`)
nrepetidos.push(cnt)
}
//GROUP RACES AND AGES
var idade2 = []
var total = []
var nr = 0
for (var i = 0; i<raça2.length; i++) {
var ni = nr
nr += nrepetidos[i]
idade2.push(idade.slice(ni, nr))
total.push(`${raça2[i]} : ${idade2[i]}`)
}
//CHANGE "," BY " || "
for (i=0; i<total.length; i++) {
total[i] = total[i].replace(/,/g, ' || ')
}
//WRITE
for (var i=0; i<total.length; i++) {
document.write(total[i]+ "<br /><br />");
}
}
最后,如果input:number = 10
我有类似的东西:
1 elf (female) : very young
3 elf (male) : adult || young || adult
1 gnome (male) : young
1 human (female) : adult
4 human (male) : young || very young || very young || old
当input:number
具有像 10 这样的低值时,结果可以读取,但如果值较高,结果会变得复杂。有没有办法把它组织成这样:
1 elf (female) : very young
3 elf (male) : 2 adult || young
1 gnome (male) : young
1 human (female) : adult
4 human (male) : young || 2 very young || old
但仍然保持随机属性?
解决方案
你可以使用一个对象来保存你的数据,这样处理起来更容易
const races = ['human (male)', 'human (male)', 'human (male)', 'human (female)', 'human (female)', 'human (female)', 'elf (male)', 'elf (male)', 'elf (female)', 'elf (female)', 'half-elf (male)', 'half-elf (female)', 'half-orc (male)', 'half-orc (female)', 'gnome (male)', 'gnome (female)'];
const ageGroups = ['very young', 'young', 'adult', 'old'];
// helper function to get a random element from an array
const randomElement = arr => arr[Math.floor(Math.random() * arr.length)];
// a function to get random n element from races and ageGroups arrays
const magic1 = (races, ageGroups, n) => {
const obj = {};
for (let i = 0; i < n; i++) {
const ageGroup = randomElement(ageGroups);
const race = randomElement(races);
if (!obj[race]) obj[race] = {};
if (!obj[race][ageGroup]) obj[race][ageGroup] = 0;
obj[race][ageGroup]++;
}
return obj;
};
// a function to convert the object returned by magic1 to an array of strings with the same format you wanted
const magic2 = (obj) => {
const res = [];
for (var prop in obj) {
const ageGroups = [];
let acc = 0;
for (var ageGroup in obj[prop]) {
const count = obj[prop][ageGroup];
acc += count;
ageGroups.push((count === 1 ? '' : `${count} `) + ageGroup);
}
res.push(`${acc} ${prop} : ${ageGroups.join(' || ')}`);
}
return res;
};
console.log(magic2(magic1(races, ageGroups, 10)));
推荐阅读
- java - 数组java中的最小值
- javascript - 通过 vue 和 electron 共享一个全局变量
- python - 如何在已知变量的情况下数值求解多变量联立方程?
- c - C语言:从文件重定向输入时如何知道何时不再有来自标准输入的输入
- javascript - 如何在 onwrite 事件中获取 firebase pushID?
- javascript - 具有两个数字输入的多个滑块
- php - 找不到驱动程序,将php连接到sql server
- dart - dart中的完整路径和相对路径有什么区别
- python - Django Rest Framework 自定义异常处理无法识别参数
- npm - 纱线安装,模块构建失败:错误:找不到预设“es2015”