1

我在 TypeScript 中有很多 foreach,其中一些:

 $.each(obj.triggers, function (index, value) {
                (<any>sc.triggers).push(Trigger.objectToTrigger(value));
            });    
$.each(obj.notStartTriggers, function (index, value) {
                (<any>sc.notStartTriggers).push(Trigger.objectToTrigger(value));
            });

我如何重构这个 foreach 的?对于这个 foreach,我需要一种方法。

谢谢大家。我需要更新 sc.notStartTriggers 集合,而不是添加(推送)?

4

2 回答 2

0

重构代码的主要目的可能是删除强制转换,而不是删除轻微的重复。

此外,您不需要走得太远any,因为您要查找的操作来自数组,因此您可以使用any[]至少让您知道的操作。

我通过允许将两个参数传递给我的方法来扩展 Robert C Martin 关于参数数量的规则:) - 参数按照方法名称暗示的顺序,将触发器添加到数组

function addTriggerToArray(trigger: any, triggerArray: any[]) {
    triggerArray.push(trigger);
}

$.each(obj.triggers, function (index, value) {
    addTriggerToArray(Trigger.objectToTrigger(value), sc.triggers);
});    
$.each(obj.notStartTriggers, function (index, value) {
    addTriggerToArray(Trigger.objectToTrigger(value), sc.notStartTriggers);
});

要更新现有项目,您将使用...

function updateTrigger(trigger: any, index: number, triggerArray: any[]) {
    triggerArray[index] = trigger;
}

$.each(obj.triggers, function (index, value) {
    updateTrigger(Trigger.objectToTrigger(value), index, sc.triggers);
});    
$.each(obj.notStartTriggers, function (index, value) {
    updateTrigger(Trigger.objectToTrigger(value), index, sc.notStartTriggers);
});
于 2013-04-26T08:12:08.497 回答
0

因此,您有一个属性obj和相同的属性sc,您想使用触发器循环。所以这是一个将这些作为参数的函数:

function process(obj,sc,property:string,Trigger){
    $.each(obj[property], function (index, value) {
                (sc[property]).push(Trigger.objectToTrigger(value));
            });     
}

process(obj,sc,"triggers",Trigger);
process(obj,sc,"notStartTriggers",Trigger);

请注意,以下内容在 javascript / typescript 中是等价的:

x.asdf
x["asdf"]
于 2013-04-25T08:36:24.047 回答