【问题标题】:Creating JavaScript objects inside of a for loop and using the unique objects in a different for loop在 for 循环中创建 JavaScript 对象并在不同的 for 循环中使用唯一对象
【发布时间】:2021-04-01 15:25:30
【问题描述】:

我一直在使用 JavaScript 代码进行自动化 GUI 测试。我一直在回顾这个整体测试并优化一些代码。例如,我有一个函数可以将值输入到窗口的所有字段中,看起来或多或少像这样:

Row Field 1 Field 2 Field 3 Field 4 Field 5 Field 6 Field 7
1
2
3
4
5
6
7
8
9
10

最初的输入函数看起来像这样:inputRowValues(row, field1, field2, field3, field4, field5, field6, field7); 这相当笨重并且占用了大量空间,并且不像编辑函数以接收具有字段作为属性值的单个对象那样简洁。现在函数看起来像这样:inputRowValues(rowObject); 其中rowObject 的定义如下:

let rowObject = 
{
    field1: someValue,
    field2: someValue,
    field3: someValue,
    field4: someValue,
    field5: someValue,
    field6: someValue,
    field7: someValue
};

这工作得很好,直到我进入测试一个特定要求的部分,即当您在窗口中输入值时,您可以关闭窗口并重新打开它并且值仍然存在。最初,我通过使用函数 (createVarArray) 创建一组数组,其中包含每个字段的 10 个随机值,其中参数 1 和 2 是随机数的最小值和最大值,参数 3 是要放置的项目数在数组中,参数4是10以外的基数的可选参数。

// Generate random values for fields
var
    field1 = createVarArray(1, 2, 10),
    field2 = createVarArray(0, 1, 10),
    field3 = createVarArray(0, 77777, 10, 8),
    field4 = constantValue,
    field5 = createVarArray(0, 77777, 10, 8),
    field6 = createVarArray(0, 31, 10),
    field7 = createVarArray(0, 7, 10)
;
    
// Boolean values to randomly enter optional fields
var
    field3Bool = createVarArray(0, 1, 10),
    field5Bool = createVarArray(0, 1, 10),
    field6Bool = createVarArray(0, 1, 10),
    field7Bool = createVarArray(0, 1, 10)
;

然后我使用 inputRowValues() 函数输入值并使用 fieldBool 数组随机将一些可选字段留空。

for (var i = 0; i < 10; i++)
{
    if (field3Bool[i] === 0) field3[i] = "";
    if (field5Bool[i] === 0) field5[i] = "";
    
    if (field6Bool[i] === 0)
    {
        field6[i] = "";
        field7[i] = "";
    }
    else if (field6Bool[i] === 1 && field7Bool[i] === 0)
    {
        field7[i] = "";
    }
    
    // Input values into fields
    inputRowValues(i+1, field1[i], field2[i], field3[i], field4, field5[i], field6[i], field7[i]);
}

然后我必须退出 for 循环,通过单击“完成”按钮“保存值”,关闭窗口然后重新打开它。

clickDone();
clickX();
openWindow();

由于这一步,我必须验证字段值是否已正确保存在单独的 for 循环中。如果我想在 for 循环中创建一个 rowObject 对象,则无法在下一个 for 循环中再次访问这些值。我能想到的唯一方法是创建 10 个不同的对象。

for (i = 0; i < 10; i++)
{
    // These fields end up padding numbers that are less than 5 digits long with 0s in front so I add the padding for verification.
    if (field3[i] !== "") field3[i] = math.pad(field3[i], 5);
    if (field5[i] !== "") field5[i] = math.pad(field5[i], 5);
    
    // Verify correct values are saved in all fields
    verifyAllFields(i+1, field1[i], field2[i], field3[i], field4, field5[i], field6[i], field7[i]);
}

我想不出一种有效的方法来实现这一点。我想到的每个解决方案都需要创建 10 个不同的过滤器对象,然后执行 10 个不同的输入函数和 10 个不同的验证函数,如果我的意图是优化代码,这似乎是倒退。

我知道这是很多代码,但希望我没有在此过程中失去你。

【问题讨论】:

    标签: javascript for-loop object


    【解决方案1】:

    管理数据

    好的,这是一个称为状态管理的问题。有很多图书馆可以让这更容易。 Redux(使用 Redux Toolkit)和 Mobx 仅举两例。我个人更喜欢 Redux 方法。

    每个“行”都可以是an entity adapter的一部分,便于序列化。

    但总而言之,您希望拥有一个全球集中的数据源来存储和更新您的数据。您希望有合理的默认值(空字段、0、false 等),并且希望它是可序列化的。它只有在一致的情况下才可序列化。如果对数据进行操作的东西不负责管理数据的存储(IE:数据的全局存储),则序列化会更容易。

    如果您选择使用状态管理库,您希望将每一行视为一个实体。每个实体都被添加到具有唯一 id 的实体适配器(行号是有效的 id)。

    您触发一个动作来添加它,并使用选择器从中提取数据。如果要保存它,请将其保存到本地存储或文件中。如果要加载它,请检查文件/本地存储并将其用作初始状态。如果不存在数据,则使用有效的“空”默认值。 (例如[]


    验证数据

    你有两个选择。自己动手,使用图书馆,或两者兼而有之。我个人使用库是因为验证通常是一个已解决的问题。

    schema-validator 是一个为你做这件事的库的例子。

    validator 是一个为您提供标准化验证功能的库示例。 (是数字,是电子邮件等)。

    我最喜欢以自己滚动方式验证数据的方法是注册一组函数,每个函数只检查一个属性。 validateField1validateField2 等。它们中的每一个都接受row,他们唯一看到的是他们负责的财产。您在 for 循环中运行每个验证器。您可以运行 所有 个验证器并报告所有错误,也可以在其中一个失败时退出。

    我最喜欢以简单方式验证数据的方法是使用class-validator

    【讨论】:

      猜你喜欢
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      • 2021-12-19
      相关资源
      最近更新 更多