我正在尝试将一些乐队名称混搭,这应该是递归递减的,我从原始数据结构中删除一个键并将其添加到新的。
如果您运行此代码,您会立即看到问题,但我无法弄清楚导致问题的原因:
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);
答案 0 :(得分:1)
number
将介于0
和N-2
之间,其中N
是剩余频段的数量。然后删除带有该号码的乐队,而不重新编号其他。经过几次迭代后,您只剩下很高的数字;当5, 6, 7, 8
只能在6, 7, 8
和number
或0
之间时,可能会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
。