在对象中使用匿名函数可以执行多个任务

时间:2015-03-21 14:35:36

标签: javascript

我有一个对象"区域" (将是世界上不同的地区),我将会有一系列具有我应用的各种属性的数据。

我希望包含代码的对象列表可以执行各种操作,例如规范化内部数据和添加权重。

这里我有TTT(总旅行时间),TJL(总行程长度)和PeaceIndex(某处有多危险)作为属性。

一旦我获得了整个列表,我就会将它们相互排列,从而开始标准化。

function region(TTT, TJL, peaceIndex) {

    var n = function (TTTtopvalue,TTTbottomvalue,TTT) {

        var colVal = parseFloat(TTT);
        var numerator = colVal - TTTbottomvalue;  //Once you have the extremes 33, 55, 56, 77 e.g. 33 and 77 then (value-min)/(max-min)  55-33=22/77-33= 22/50 = .4 whatever
        var denominator = TTTtopvalue - TTTbottomvalue;
        var result = numerator/denominator

        this.TTTnormal =result ;
    }

    this.TTT = TTT;
    this.TJL = TJL;
    this.TTTnormal = 0;
    this.TTTtopvalue = 0;
    this.TTTbottomvalue = 0;
    this.peaceIndex = peaceIndex;
    this.normaliseTTT = n;
}
    var r1 = new region(45, 33, 50);
    var r2 = new region(40, 30, 55);
    var r3 = new region(333, 100, 1);

    var testArray = [r1, r2, r3];

   console.log(JSON.stringify(testArray));

   testArray[0].TTTtopvalue = 333;
   testArray[0].TTTbottomvalue = 40;
   testArray[0].normaliseTTT(333,40,45);   //this works for TTT!!

   console.log(JSON.stringify(testArray));

    testArray.sort(function(a, b){
     return a.TTT-b.TTT
    })

   console.log(JSON.stringify(testArray));

现在,这对TTT专栏非常有用。但是,它与TJL和peaceIndex列的代码相同。

我似乎无法使用该匿名函数将规范化值返回给其他属性。

我该怎么做?

所以原型将是

function (topvalue,bottomvalue,TTT or TJL or peaceIndex)

每次保存输入的东西

1 个答案:

答案 0 :(得分:2)

关注点分离就是答案。您需要一个表示标准化值的单独类。

function NormalizedValue(value, top, bottom) {
    this.init(value, top, bottom);
}
NormalizedValue.prototype.init = function (value, top, bottom) {
    value = parseFloat(value);
    top = parseFloat(top);
    bottom = parseFloat(bottom);
    this.value = value;
    this.normalized = (value - bottom) / (top - bottom);
}

然后

function Region(name) {
    this.name = name;
    this.TTT = new NormalizedValue();
    this.TJL = new NormalizedValue();
    this.peaceIndex = new NormalizedValue();
}

var r1 = new Region("A");
var r2 = new Region("B");
var r3 = new Region("C");

r1.TTT.init(333, 40, 45);
r1.TJL.init(40, 30, 25);
r1.peaceIndex.init(1, 5, 1);
// and so on for the others...

然后,例如

testArray.sort(function (a, b) {
    return a.TTT.normalized - b.TTT.normalized;
});

你可以用不同的方式构造你的Region构造函数,以便可以将更多的init值作为参数传递,但要注意它不要太乱(10参数构造函数不是很好的东西)。