问题描述
我正在尝试混搭一些乐队名称,这应该是递归的,我从原始数据结构中删除一个键并将其添加到新的。
如果你运行这段代码,你会立即看到一个问题,但我不知道是什么导致了它:
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楼
Amadan
1
已采纳
2015-07-31 07:54:16
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
。