Mashup band名称递归

时间:2015-07-31 07:30:06

标签: javascript recursion

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

如果您运行此代码,您会立即看到问题,但我无法弄清楚导致问题的原因:

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

1 个答案:

答案 0 :(得分:1)

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

使用数组和splice会好得多。如果您确实想要使用对象,请不要使用bands[number],而应使用bands[Object.keys(bands)[number]]。 (此外,完全没有必要转换为字符串。)另外,

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

没有-1

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