【发布时间】:2012-07-11 17:18:14
【问题描述】:
我有一个包含对象的多维数组,如果对象包含特定属性,我希望从数组中删除它们。
咖啡脚本
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); in firebug
第二行的存在究竟如何导致上一行中的变量未定义?
渲染的 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);
}
}
(旁注:.remove 已通过 Resig 添加到 Array 原型中)
更新
这是我的一个逻辑错误。查看批准的答案以了解原因。贝娄是我最终做的并且效果很好:
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 确保循环结束,而不是跳过可能更难捕捉的元素。
-
您认为我的
while循环版本也包含风险吗? -
是的,因为当你删除一个元素时,你会跳过下一个元素。示例:列表为
[1,2,3]、i=0。如果我们决定删除i,那么在while 循环结束时我们有[2,3]、i=1。我们要查看的下一项是3,因此我们跳过了2。我会在删除元素的if内减少i,或者将增量放在else块中。我还建议不要冻结列表的长度 - 必须通过删除来跟踪长度感觉很奇怪,并且从数组中获取长度无论如何都是恒定的时间。 -
@AaronDufour 你说得有道理。我在 if 语句中添加了减量,因此在数组长度丢失一个的情况下,索引在下一次迭代中保持不变。你愿意为你认为应该做的方式写一个答案吗?
-
完成。它可能与您的代码几乎相同,在循环的开头多了一行,让我们更容易看到它与
for..in版本的关系。
标签: javascript jquery coffeescript