ppxy
@ppxy

Как правильно передать параметры в конструктор объекта?

Есть вот такой участок кода:
function ODESolver(equations) {
        this.f = [];
        this.initY = [];
        this.initX = [];
        this.dt = [];
        this.t = [];

        var i = 0;
        
        for (var eq in equations) {
            for (var param in equations[eq]) {
                if (param === "initX")
                    this.initX[i] = equations[eq][param];
                if (param === "initY")
                    this.initY[i] = equations[eq][param];
                if (param === "f")
                    this.f[i] = equations[eq][param];
                if (param === "dt")
                    this.dt[i] = equations[eq][param];
                if (param === "t")
                    this.t[i] = equations[eq][param];
            }
            i++;
        }
    }

Необходимо передавать в данный конструктор объекта параметры описывающие различные начальные условия для дифференциальных уравнений (конечно не важно, что будет передаваться. Просто на примере понятнее).
На данный момент, задание и передача параметров происходит следующим образом:
var params = {
            eq1: {
                initX: 1,
                initY: 2,
                dt: 3,
                t: 4,
                f: function() {
                    return 1;
                }
            },
            eq2: {
                initX: 5,
                initY: 6,
                dt: 7,
                t: 8,
                f: function() {
                    return 2;
                }
            }
        };
        
        var odes = new ODESolver(params);

Возник вопрос, можно ли делать данную операцию более "красиво" и правильнее?
  • Вопрос задан
  • 2232 просмотра
Решения вопроса 1
На вскидку: "объект параметры" лучше заменить на "массив параметры" - как вижу, его ключи тут не важны, соответственно и первый цикл на обычный - тем более всё равно используете индекс i. Второй, вложенный, цикл вообще не нужен. Хотя если нужна краткость, ужал бы вообще до такого:
function ODESolver(equations){
  var keys = ['f', 'initY', 'initX', 'dt', 't'];
  equations.forEach(function(eq){
    keys.forEach(function(key){
      key in this || (this[key] = []);
      this[key].push(eq[key]);
    }, this);
  }, this);
}

new ODESolver([
  {
    initX: 1,
    initY: 2,
    dt: 3,
    t: 4,
    f: function(){
      return 1;
    }
  }, {
    initX: 5,
    initY: 6,
    dt: 7,
    t: 8,
    f: function(){
      return 2;
    }
  }
]);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
aen
@aen
Keep calm and 'use strict';
Как вариант:
function ODESolver(equations) {
  this.f = [];
  this.initY = [];
  this.initX = [];
  this.dt = [];
  this.t = [];

  var i = 0;

  for (var eq in equations) {
    for (var param in equations[eq]) {
      this[param][i] = equations[eq][param];
    }
    i++;
  }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
01 дек. 2021, в 22:24
70000 руб./за проект
01 дек. 2021, в 21:19
1200 руб./за проект