【问题标题】:Iterate over a method for the given arguments迭代给定参数的方法
【发布时间】:2019-05-14 11:42:04
【问题描述】:

我希望简化以下代码结构。

以下代码的作用是动态调用具有不同参数的对象myObjectset 方法。

myObject.set("value1", 1);
myObject.set("value2", 1);
myObject.set("value3", 1);
myObject.set("value4", 12);

一种选择是将值保存在数组中,例如

var myArr = [["value1",1], ["value2", 1], ["value3",1], ["value4", 12]];

并反复调用myObject.set获取上述数组的大小。

我正在考虑使用loadash 来简化此操作,但找不到任何合适的方法。 (我尝试了_.over 方法,但无法正常工作)

loadash有什么合适的想法或方法吗?

【问题讨论】:

  • 什么是myObject?以及如何通过重复调用set 来获得它的大小?
  • myObject 只是一个包含函数set 的javascript 对象。现在,我需要为数组myArr中的所有元素调用myobject 的这个函数'set`。

标签: javascript angularjs lodash


【解决方案1】:

我不确定您真正想要实现什么,但我认为您正在寻找“Rest 参数”

文档:https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Functions/rest_parameters

示例:

myObject.set = function(...theArgs){ 
    theArgs.forEach((argument) => {
         //Do your logic
         console.log(argument)
    })
}

myObject.set(["value1",1], ["value2", 1], ["value3",1], ["value4", 12])

【讨论】:

  • 嗯,很好的答案。但是对于无法修改myobject.set 的情况呢?可以将其视为外部库。
  • “myObject”这个名字表明你是自己制作的,并且可以完全控制逻辑/代码。你要去哪里还不是很清楚
  • 为了简化,我这样做了。我实际上是在为一组不同的参数重复调用外部库中的方法。
  • 那你应该去 Array.forEach()
【解决方案2】:

在调用set时使用Array.forEach()迭代数组和spread值(子数组):

const myObject = { set: console.log };

const multiSet = arr => arr.forEach((v) => myObject.set(...v))

const arr = [["value1",1], ["value2", 1], ["value3",1], ["value4", 12]];

multiSet(arr);

使用 lodash/fp 可以生成一个函数来处理带有 _.forEach()_.spread() 的数组(lodash 还需要 _.partialRight()):

const { forEach, spread } = _;

const myObject = { set: console.log };

const multiSet = forEach(spread(myObject.set.bind(myObject))); // or lodash - partialRight(forEach, spread(myObject.set.bind(myObject)))

const arr = [["value1",1], ["value2", 1], ["value3",1], ["value4", 12]];

multiSet(arr);
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>

【讨论】:

  • 看起来很酷。顺便说一句,你能解释一下你的second line。特别是在您使用myObject.set(...v) 的地方。为什么有 3 个点?
  • 该值为array[a, b],您想将其转换为函数参数set(a, b)。为此,您可以使用spread syntax
【解决方案3】:

如果你只是想用myArr 中的每个项目调用myObject.set,你不需要lodash,你可以使用vanilla JavaScript

var myArr = [["value1",1], ["value2", 1], ["value3",1], ["value4", 12]];
myArr.forEach(args => myObj.set(args[0], args[1]))

或者如果参数可以变化,你可以简单地传播它们:

myArr.forEach(args => myObj.set(...args))

【讨论】:

  • 很好的答案。谢谢。
【解决方案4】:

您还可以编写set 函数,使其能够处理多种类型的参数。只是为了灵活

function MyObject() {
  this.map = {};
}

MyObject.prototype.set = function() {
  var args = Array.from(arguments);
  // var args = Array.prototype.slice.call(arguments, 0);
  for(var i = 0; i < args.length; i++) {
    if(Array.isArray(args[i])) {
      this.map[args[i][0]] = args[i][1];
    } else {
      this.map[args[i]] = !Array.isArray(args[i+1]) ? args[i++] : undefined;
    }
  }
}

MyObject.prototype.get = function() {
  console.log(this.map);
}

var myObject = new MyObject();


myObject.set("value1", 1, ['value2', 2], 'value3', ['value4', 4]);
console.log(myObject.get());

【讨论】:

    猜你喜欢
    • 2010-12-02
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    相关资源
    最近更新 更多