【问题标题】:What is the best way to convert the jQuery .each() method to a native JavaScript abstraction?将 jQuery .each() 方法转换为原生 JavaScript 抽象的最佳方法是什么?
【发布时间】:2012-09-11 22:25:44
【问题描述】:

您好,感谢您的关注!

背景

我正在使用 Node.JS 构建我的第一个应用程序,并且正在用原生 JavaScript 替换基于 jQuery 的习惯。

对于大多数项目,这是微不足道的;但是,我发现我真的很怀念 jQuery 的 $.each() 抽象的优雅,我想做一些类似的事情而不依赖 jQuery。

不幸的是,同样的代码在 JavaScript 中有点繁琐:

myArray = ["item 1", "item 2", "item 3"];
for(i=0; i<myArray.length; i++) {
    myArray[i] = "Do Something Here".
};

我想做的是这样的:

myArray = ["item 1", "item 2", "item 3"];
myArray.each(function(){
    //do stuff
});

问题

是否已经有一种扩展方法可以实现这一点?我忍不住想我在重新发明轮子。如果没有任何东西,扩展方法最好吗?

【问题讨论】:

  • 原生 Array 原型上有一个 .forEach() 函数。
  • for 循环有什么问题? (除了你的隐式全局i
  • 对于数组:arr.forEach( fn );。对于(非数组)对象:Object.keys( obj ).forEach( fn );.
  • @jbabey-- 本身没什么,我只是喜欢在不损失性能的情况下抽象一些东西。这只是个人喜好;对我来说,代码变得更具可读性。
  • 还有for( i in myArray ){ alert( i + ': ' + myArray[i] ); }

标签: javascript jquery node.js


【解决方案1】:

在 EcmaScript 5 中有 forEach() :https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach

但是不兼容IE

所以你可能需要使用这个库才能被所有浏览器支持:https://github.com/kriskowal/es5-shim

【讨论】:

  • 好的,谢谢大家!我不能再接受这个答案了 10 分钟。 . .
  • @Pointy--请原谅我的无知,但我在 Node.js 中的事实是否使这个答案不正确(我是认真地问,不是一个聪明的 a$$)。
  • @MatthewPatrickCashatt 表示你不用担心IE :)
【解决方案2】:

ECMA Script 5 包含一个名为 forEach 的 Array 方法。数组的用法与jQuery.each 相同。

不再需要使用for...in 循环,因为Array.forEach 很容易实现(请参阅文档中间的MDN 文档链接)。

为了澄清,forEach 将仅循环遍历数组,而不是对象或 jQuery 对象。

【讨论】:

  • 不,这并不完全正确 - 传递给回调的参数在 $.each() 和原生 .forEach() 之间是不同的。
  • 只是它只是数组的一种方法,这使得它与jQuery.each完全不同
  • 我的意思是说只有数组的用法是一样的。真的有必要投 2 票吗?
  • @Austin 我没有投反对票,但用法确实不一样 - .forEach()(value, index, array) 传递给回调,而 $.each() 传递 (index, value)
【解决方案3】:

你可以使用

for( i in myArray ){ 
    alert( i + ': ' + myArray[i] ); /* your actions here */
}

【讨论】:

  • 您还想在 for 循环中检查 myArray.hasOwnProperty(i)... 但这需要比使用 Array.forEach 更多的代码
  • @Austin 感谢您的澄清。
  • 在数组上使用for ... in 是个坏主意。
  • @Pointy,即使您知道要处理的数组是什么? :)
  • Be careful with w3schools. 另一篇文章也很糟糕——JavaScript 没有“关联数组”。它现在可以工作,但规范没有规定for ... in 循环中的迭代顺序。它用于迭代对象的属性,这些属性无论如何都没有内在的顺序。
【解决方案4】:

如果你想坚持自己的习惯,jQuery 也可用于节点。

npm install jquery

【讨论】:

    【解决方案5】:

    如果您的目标是在 node.js 中使用 foreach,您可能需要查看异步库。这使您可以并行化您的 foreaches。

    https://github.com/caolan/async

    【讨论】:

      猜你喜欢
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 2016-05-29
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多