Перебрать метод для заданных аргументов - PullRequest
0 голосов

У меня есть следующая кодовая конструкция, которую я хочу упростить.

То, что делает приведенный ниже код, это вызов метода set объекта myObject с различными параметрами на лету.

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?

Ответы [ 4 ]

2 голосов
/ 14 мая 2019

Я не уверен, что вы на самом деле хотите достичь, но я думаю, что вы ищете «параметр покоя»

документы: 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])
1 голос
/ 14 мая 2019

Вы также можете написать свою функцию 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());
1 голос
/ 14 мая 2019

Если вы просто хотите позвонить myObject.set с каждым элементом в myArr, вам не нужен lodash, вы можете использовать ванильный 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))
1 голос
/ 14 мая 2019

Используйте Array.forEach() для итерации массива и распространяйте значения (подмассив) при вызове set:

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>
...