如何在 vanilla JS 中重写此 ramda.js 代码

How to rewrite this ramda.js code in vanilla JS

为了减小 JavaScript 大小,我正在从我继承的一些代码中删除 ramda。但是我坚持下面的内容,因为这条线真的让我感到困惑,因为它显然不对任何对象进行操作。

var iterate = R.addIndex(R.forEach);

相关代码如下所示:

var lis = $(el).find("ul.navbar-nav:not(.navbar-right) > li:not(.nav-more)");

var iterate = R.addIndex(R.forEach);

iterate(function(li) {
    // Other code

}, lis);

如何用 vanilla JS 编写它?

R.addIndex() is applied to R.forEach() 时,它创建了一个简单地迭代项目的函数,并为每个项目分配一个从零开始的索引:

var lis = ["a", "b", "c"];

var iterate = R.addIndex(R.forEach);

iterate(function(li, index) {
  console.log(li, index)
}, lis);
<script src="//cdn.jsdelivr.net/npm/ramda@0.25.0/dist/ramda.min.js"></script>

使用 Array.from with Array.forEach():

可以很容易地用香草 JavaScript 替换

var lis = ["a", "b", "c"];

var iterate = (fn, list) =>
  Array.from(list)
    .forEach(fn);

iterate(function(li, index) {
  console.log(li, index);
}, lis);

如果Array.from()不可用,需要ES5解决方案,则可以使用Array.prototype.slice()转换为数组:

var lis = ["a", "b", "c"];

var iterate = function(fn, list) {
  Array.prototype.slice.call(list)
    .forEach(fn);
}

iterate(function(li, index) {
  console.log(li, index);
}, lis);

最后,可以转换为适用于任何

的简单 for 循环

var lis = ["a", "b", "c"];

var iterate = function(fn, list) {
  for (var i = 0; i < list.length; i++)
    fn(list[i], i);
}

iterate(function(li, index) {
  console.log(li, index);
}, lis);

使用 Array.from() 将对象转换为标准数组然后你 JS Array.forEach():

const iterate = (fn, o) => Array.from(o).forEach(fn)

iterate(function(li) {
  // Other code   
}, lis);