将对象文字转换为可重用类?

时间:2016-09-02 20:03:23

标签: javascript javascript-objects nvd3.js angular-nvd3

是否可以在下面使用此代码并使其易于重复使用,而无需在每次创建新选项时进行复制和粘贴:

optionA: {
  chart: {
    type: 'stacked',
    color: 'red',
    showControls: false
  }
}

现在,如果我想要另一张图表,我现在必须这样做:

optionB: {
  chart: {
    type: 'line',
    color: 'yellow',
    showControls: false
  }
}

如果有一种方法可以创建一个类或类似的东西,这样我就可以添加一个新的选项,而不必重用所有相同的代码,有点像隐藏一些不需要知道的东西为实施。我已经四处寻找方法,但我的搜索没有成功。

编辑:到目前为止看到回复后,我可能没有足够的信息。以下是完整数据:

timelineA: {
    chart: {
        type: 'stackedAreaChart',
        color: defaultColor,
        showControls: false,
        showLegend: false,
        useInteractiveGuideline: true,
        margin: margin,

        x: AnalysisTransforms.xValue,
        y: function(d){
            return d[1];
        },

        forceY: [0, 1],

        noData: $scope.translations.noData,
        xAxis: {
            showMaxMin: false,
            tickPadding: 16,
            tickFormat: AnalysisTransforms.formatDate,
            tickValues: AnalysisTransforms.xAxisTicks
        },
        yAxis: {
            tickPadding: 16,
            tickFormat: AnalysisTransforms.formatInteger
        }
    }
}

timelineB: {
    chart: {
        type: 'line',
        color: defaultColor,
        showControls: false,
        showLegend: false,
        useInteractiveGuideline: true,
        margin: margin,

        x: AnalysisTransforms.formatLine,
        y: AnalysisTransforms.linex,

        noData: $scope.translations.noData,
        xAxis: {
            showMaxMin: false,
            tickPadding: 16,
            tickFormat: AnalysisTransforms.formatParseDate,
            tickValues: AnalysisTransforms.xticks
        },
        yAxis: {
            tickPadding: 16,
            tickFormat: AnalysisTransforms.formatInteger
        }
    }
}

这是来自angular-nvd3,并且我没有足够的支持来解决这个问题。我已经开始为此创建一个课程,但不要认为我遵循最佳实践,因为我不知道如何将这样的对象文字转换成我可以为任何图表创建的类我想要创造。

我看到的是,在2之间使用了一些代码,而在某些代码之间没有使用。我希望我不会在这个问题上超越帮助能力而感到困惑。

3 个答案:

答案 0 :(得分:1)

东西:

var defaults = {
  color: defaultColor,
  showControls: false,
  showLegend: false,
  useInteractiveGuideline: true,
};

function buildChart(type, opts) {
  return Object.assign({
    type: type,
  },
  defaults,
  opts);
}

// Then you can do variations as 
var lineChart = buildChart('line', { color: '#CCC' });
var barChart = buildChart('bar', { color: 'red' });

Object.assign optsdefaults最后一步很重要,因此可以在需要时覆盖<%= f.select(:color, Wine.colors.keys.map {|key| [key.humanize, key]}) %>

答案 1 :(得分:0)

  function getObj(opts) {
     return {
        type: opts.type,
        colour: opts.colour,
        showControls: opts.showControls
     }
  }

  var b = getObj({type: 'sometype'})

如果需要,您可以添加一些默认值,但上面应该可以使用

答案 2 :(得分:0)

是的,你可以轻松创建对象...如果你在最近的浏览器上工作,有一个更好的方法来做到这一点。但这只是一个启动你的样本

var Option = (function ()
{
     var Class = function (Type, Color)
     {
        this.chart = {
        type: Type,
        color: Color,
        showControls: false
      };
};

    (Class.prototype);
    return Class;
})();

var optionA = new Option('stacked', 'red');
var optionB = new Option('line', 'yellow');

此处为Fiddle