JS одна и та же функция, разные параметры в каждом значении объекта. Как мне писать меньше? - PullRequest
0 голосов
/ 21 июня 2020

То, что я сделал

Я вызываю функцию в значении объекта.

И эта функция будет вызываться в каждом объекте столько, сколько пользователи добавляют absent данные.

Что я хочу сделать

Следовательно, я понимаю, что у меня могут быть тысячи сотен новых объектов, я бы предпочел минимизировать / исключить дублирование, чем писать функция каждый раз.

Объясните, для чего нужен код

Имя функции, которое я хотел бы автоматически установить, - datesBetween().

datesBetween() может выбрать режим, и у него есть параметры.

Режим ссылается на значение из ключа reason, который находится в том же объекте. Значение arr[0].absent[0].datesBetween должно быть datesBetween('leave')('2020-1-1','2020-1-4').

Параметры совпадают. Первый параметр должен ссылаться на ключ объекта start, который находится в том же объекте, второй параметр должен ссылаться на ключ объекта end.

Некоторые идеи

  1. Думаю, здесь можно использовать class, но я боюсь путаться с функциями. если класс поможет, скажите, пожалуйста.
  2. Я пишу this ты, я не уверен насчет this. Может ли использование this быть решением в этом коде?
    var arr = [
      {
        name : "A", 
        absent :[ 
          {
            reason : "leave",
            start : '2020-1-1',
            end : '2020-1-4',
            datesBetween : datesBetween('leave')(this.start, this.end)
          }, {
            reason : "sleeOver",
            start : '2020-1-25',
            end : '2020-1-26',
            datesBetween : datesBetween('sleeOver')(this.start, this.end)
          }    
        ]
      }, {
        name : "B", 
        absent :[
          {
            reason : "weekendExcursion",
            start : '2020-1-18',
            end : '2020-1-19',
            datesBetween : datesBetween('weekendExcursion')(this.start, this.end)
          }
        ]
      }  
    ]
    
    function autoAbsentSetter(){
      //do I need class to use inheritance/property things?
      
    }
    
    function addAbsent(mode){
      var funcs = {
        'leave' : function absent_leave(name, absentName, absentStart, absentEnd){ //all kinds of leave are included. Detail further.
        //some codes
        },
        'sleepOver' : function absent_sleepOver(name, absentName, absentStart, absentEnd){
        //some codes
        },
        'weekdayExcursion' : function absent_weekdayExcursion(name, absentName, absentStart, absentEnd){
        //some codes
        },
        'weekendExcursion' : function absent_weekendExcursion(name, absentName, absentStart, absentEnd){
        //some codes
        }
      }
      return funcs[mode];
    }

1 Ответ

0 голосов
/ 21 июня 2020

Вам не нужно помещать эти функции внутри литерала массива (и да, вы все равно не можете получить доступ к другим свойствам ). Просто напишите

var arr = [
  {
    name: "A", 
    absent: [ 
      {
        reason : "leave",
        start : '2020-1-1',
        end : '2020-1-4',
      }, {
        reason : "sleepOver",
        start : '2020-1-25',
        end : '2020-1-26',
      }    
    ]
  }, {
    name: "B", 
    absent: [
      {
        reason : "weekendExcursion",
        start : '2020-1-18',
        end : '2020-1-19',
      }
    ]
  }  
];

for (const value of arr) {
  for (const absence of value.absent) {
    absence.datesBetween = datesBetween(absence.reason)(absence.start, absence.end);
  }
}

Вы можете делать все, что захотите в этой l oop обработке ваших данных.

...