如何将令人烦恼的“for”循环转换为“Object.keys”例程或类似程序(JSLint)

Posted

技术标签:

【中文标题】如何将令人烦恼的“for”循环转换为“Object.keys”例程或类似程序(JSLint)【英文标题】:How to translate vexing 'for' loop into 'Object.keys' routine or similar (JSLint) 【发布时间】:2016-05-13 10:43:18 【问题描述】:

我正在尝试遵循 JSLint 的“最佳实践”,它不鼓励使用 for 循环,推荐使用 Object.keys 和类似的替代方法。大多数for 循环都可以通过forEach 轻松转换为Object.keys,如下所示:

Object.keys(object).forEach(function (key) 

等等

还有一个真实世界的例子:

var elems = document.getElementsByClassName('myClass');
Object.keys(elems).forEach(function (key) 
    elems[key].style.display = 'block';
    elems[key].style.visibility = 'visible';
);

但是,我对如何将以下例程转换为不使用标准 for 循环的形式感到困惑。

var selection = window.getSelection();
var htmlDiv = document.createElement("div");
var i;
for (i = 0; i < selection.rangeCount; ++i) 
    htmlDiv.appendChild(selection.getRangeAt(i).cloneContents());

我不需要遍历window.getSelection();我需要使用window.getSelection() 的原生getRangeAt() 函数按范围抓取文本。

任何线索如何在不使用上述标准for 循环的情况下执行此操作?

【问题讨论】:

等等,什么?? JSLint 是说使用Object.keys 而不是普通的for 循环?因为Object.keys 性能更高?这没有任何意义。 可以用while循环代替for循环,或者使用Array.prototype.forEach() 是的,JSLint 不鼓励“for”循环,并提供了一个基本原理。见:jslint.com/help.html#for 【参考方案1】:

好吧,我将成为猴子的叔叔。被 JSLint 用 'Object.keys' 代替 'for' 的处方误导(参见:jslint.com/help.html#for),@guest271314 建议使用简单的 'while' 循环成功并通过了 JSLint 的标准:

while (i < selection.rangeCount) 
    htmlDiv.appendChild(selection.getRangeAt(i).cloneContents());
    i += 1;

JSLint 也坚持 'i += 1;'而不是i++; 并提供了一个基本原理(参见http://www.jslint.com/help.html#inc)。但是他们没有解释为什么while 循环与“for”循环相比是可以的;有人愿意推测吗?

【讨论】:

以上是关于如何将令人烦恼的“for”循环转换为“Object.keys”例程或类似程序(JSLint)的主要内容,如果未能解决你的问题,请参考以下文章

您如何在方案中运行等效的嵌套 for 循环

如何将 for 循环转换为流

如何将for循环转换为map函数

如何将for循环输出转换为列表?

如何将 JavaScript for 循环转换为 CoffeeScript?

如何将 For 循环结果转换为数组,然后在 C# 中计算结果数组的整数?