首页 > 解决方案 > 组织具有重复元素的多维数组

问题描述

我写了一个代码来帮助我快速组织我的 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

但仍然保持随机属性?

标签: javascriptsortingmultidimensional-arrayreplace

解决方案


你可以使用一个对象来保存你的数据,这样处理起来更容易

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)));


推荐阅读