如何从迭代器本地链接JavaScript方法

How to chain JavaScript methods natively from an iterator?

本文关键字:链接 JavaScript 方法 迭代器      更新时间:2023-09-26

假设我使用js方法返回'this',因此可以像这样链接:

something.add({a: 'xyz', b: 123}).add({a: 'abc', b: 456});

如何将这些链接到迭代器上?例如:

$scope.bindings = [
     {
            key: 'up',
            func: function() {
                $scope.scroll(1)
            }
        },{
            key: 'down',
            func: function() {
                $scope.scroll(-1);
            }
        },
];

——编辑——

我使用的库是Angular热键。我想用一种一般的方式来帮助那些处于类似处境的人。

我有:

var hotBindings = hotkeys.bindTo(scope);

  for (var bind of scope.bindings) {
      hotBindings = hotBindings.add({
        combo: bind.key,
        callback: function(e) {
            e.preventDefault();
            bind.func();
         }
      })
 }

这将'down'方法分配给两个按键。如果我写出没有循环的代码,使用scope.bindings[index]。Key(例如)并链接.add()方法,然后它就可以工作了。我也试过没有"hotBindings ="

请不要提及scopve和$scope,因为这是在angular指令中传递给链接函数的——angular几乎肯定与它没有任何关系。

我看到的唯一问题是for (var bind of bindings)不工作

编辑:认为它与for (var bind of bindings)语法和var vs . let有关,事实证明提供的代码可以正常工作。如果真正的问题浮出水面,我就删掉这个答案。必须在Something类?

一切似乎都在工作:

var Something = function() {
  this.data = [];
  this.add = function(item) {
    this.data.push(item);
    return this;
  }.bind(this);
};
var bindings = [{
  x: 'hi',
  func: function() {
    console.log("hi");
  }
}, {
  x: 'bye',
  func: function() {
    console.log("bye");
  }
}];
var something = new Something();
for (var bind of bindings) {
  something.add({
    x: bind.x,
    callback: bind.func
  })
};
console.log(something.data);

我不确定SomeThing是什么或者它的add方法返回什么,但您可以通过执行

来复制链接
let something = new Something();
for (const bind of bindings) {
    something = something.add({
        x: bind.x,
        callback: bind.func
    });
}

如果您经常这样做(可能使用不同的方法而不仅仅是"add"),您可以考虑使用辅助函数:

function chain(obj, ...calls) {
  for(let {method, args} of calls) {
    obj = obj[method](...args)
  }
  return obj
}
chain(new Somthing(), [
  {meth: 'add', args: [
    {x: 'hi', func: () => console.log('hi')}]},
  {meth: 'add', args: [
    {x: 'bye', func: () => console.log('bye')}]}
  ]})