当前位置: 代码迷 >> JavaScript >> 混搭乐队名称递归
  详细解决方案

混搭乐队名称递归

热度:59   发布时间:2023-06-05 11:55:02.0

我正在尝试混搭一些乐队名称,这应该是递归的,我从原始数据结构中删除一个键并将其添加到新的。

如果你运行这段代码,你会立即看到一个问题,但我不知道是什么导致了它:

Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

var bands = {

    "1": 'stone temple pilots',
    "2": 'alice in chains',
    "3": 'fats domino',
    "4": 'A Box of Fish with Tartar Sauce',
    "5": 'Barthalomu Cubbins',
    "6": 'Third World',
    "7": 'Third Eye Blind',
    "8": 'Alcoholocaust'

};

var newBands = {

};

var seed = Math.floor(Math.random()*(Object.size(bands)-1));

console.log(seed);

var next;
var str;

function getOther(number){

    if(Object.size(bands) > 0){

        str = String(number);

        newBands[str] = bands[str];
        console.log(newBands[str]);
        delete bands[str];
        console.log(Object.size(bands));
        next = Math.floor(Math.random()*(Object.size(bands)-1));
        getOther(next);
    }
}


getOther(seed);

number将介于0N-2 ,其中N是剩余频段的数量。 然后您删除带有该编号的乐队,而无需重新编号其他乐队。 经过几次迭代后,您将只剩下高数字; 可能是5, 6, 7, 8 ,甚至可能只是6, 7, 8 ,此时number只能介于023 无论选择哪个数字,该数字下都没有元素,没有任何内容被删除,对象不会缩小,递归继续进行。

使用数组和splice会好得多。 如果你真的想使用一个对象,那么不要使用bands[number] ,而是bands[Object.keys(bands)[number]] (此外,完全不需要转换为字符串。)另外,

number = Math.floor(Math.random() * Object.size(bands));

没有-1

编辑:此外,您的Object.size(obj)可以替换为Object.keys(obj).length

  相关解决方案