我有一个包含对象的多维数组,我希望从数组中删除对象,如果它们包含特定的属性。bizzare未定义变量
CoffeeScript的
for dataColumn in allDataColumns
for brentSpiner, i in dataColumn
console.log i, brentSpiner.refreshRate
#dataColumn.remove i if brentSpiner.refreshRate is -1
上述console.log
作品时行波纹管被注释掉
for dataColumn in allDataColumns
for brentSpiner, i in dataColumn
console.log i, brentSpiner.refreshRate
dataColumn.remove i if brentSpiner.refreshRate is -1
上述错误了,像这样的预期:brentSpiner is undefined console.log(i, brentSpiner.refreshRate);
的萤火
怎么上地球可能在第二行的存在导致上述行中的变量becom未定义?
RENDERED JAVASCRIPT
失败
for (_i = 0, _len = allDataColumns.length; _i < _len; _i++) {
dataColumn = allDataColumns[_i];
for (i = _j = 0, _len1 = dataColumn.length; _j < _len1; i = ++_j) {
brentSpiner = dataColumn[i];
console.log(i, brentSpiner.refreshRate);
if (brentSpiner.refreshRate === -1) {
dataColumn.remove(i);
}
}
}
作品
for (_i = 0, _len = allDataColumns.length; _i < _len; _i++) {
dataColumn = allDataColumns[_i];
for (i = _j = 0, _len1 = dataColumn.length; _j < _len1; i = ++_j) {
brentSpiner = dataColumn[i];
console.log(i, brentSpiner.refreshRate);
}
}
(侧注:卸下摆臂已被添加到经由Resig的阵列原型)
UPDATE
这是我的一个逻辑错误。查看获得批准的答案以查看原因。贝娄是我落得这样做并运作良好:
for dataColumn in allDataColumns
i = 0
len = dataColumn.length
while i < len
if dataColumn[i].refreshRate is -1
dataColumn.remove i
len--
i++
渲染
for (_i = 0, _len = allDataColumns.length; _i < _len; _i++) {
dataColumn = allDataColumns[_i];
i = 0;
len = dataColumn.length;
while (i < len) {
if (dataColumn[i].refreshRate === -1) {
dataColumn.remove(i);
len--;
}
i++;
}
}
从正在循环的数组中拉出元素是一种不稳定的操作。通过固定循环长度,coffeescript确保这将运行到最后,而不是跳过可能难以捕捉的元素。 – 2012-07-12 05:09:22
您是否认为我的'while'循环版本也存在风险? – Fresheyeball 2012-07-12 20:07:57
是的,因为当你删除一个元素时,你会跳过下一个元素。例如:列表是'[1,2,3]','i = 0'。如果我们决定删除'i',那么在while循环结束时我们有'[2,3]','i = 1'。下一个我们看到的是'3',所以我们跳过了'2'。我会在删除元素的'if'中减去'i',或者将增量放在'else'块中。我也建议不要冻结列表的长度 - 必须通过移除跟踪长度感觉很奇怪,并且从数组获得长度是恒定的时间。 – 2012-07-13 14:38:33