js的直接赋值导致在循环中赋值失败的问题

本文探讨了JavaScript中使用for循环进行对象赋值时遇到的问题,即所有对象最终都被赋予了最后一个循环值。通过debug发现,问题根源在于JavaScript的对象赋值机制。文章详细解释了解决方案:采用深拷贝来避免对象引用导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写js遇到了一个问题,就是说我在for循环值通过循环的值给一个对象赋值,但是的话每次赋值打印的结果都为最后一次赋的值,然后我就开始了debugger,发现我debug执行的话并没有问题,但是如果不debug就还会出现所有的赋值都是最后一个值得问题,这是我的代码

      var poster_name = this.More_Temp_count['posterity_name']
      var city = this.More_Temp_count['city']
      var blackwidow_task = this.More_Temp_count['blackwidow_task']
      var redis_key = blackwidow_task['redis_key']
      var task_id = blackwidow_task['task_id']
      var key_test = blackwidow_task['blackwidow_output']['db_config_test']['key']
      var key_db = blackwidow_task['blackwidow_output']['db_config']['key']

      this.loading = true
      for (var x in city_list){
        // 构造请求参数
        console.log('1')
        console.log(city_list[x])
        // 每次循环重新赋值
        var More_Temp_count_copy = this.More_Temp_count
        More_Temp_count_copy['city'] = city_list[x]
        console.log(More_Temp_count_copy['city'])
        More_Temp_count_copy['posterity_name'] = poster_name.replace(city,city_list[x])
        More_Temp_count_copy['blackwidow_task']['redis_key'] = redis_key.replace(city,city_list[x])
        More_Temp_count_copy['blackwidow_task']['task_id'] = task_id.replace(city,city_list[x])
        More_Temp_count_copy['blackwidow_task']['blackwidow_output']['db_config_test'] = key_test.replace(city,city_list[x])
        More_Temp_count_copy['blackwidow_task']['blackwidow_output']['db_config'] = key_db.replace(city,city_list[x])
        console.log('准备多次新增的复制模板信息',More_Temp_count_copy["city"])
        console.log('2')
      }

———-然后我以为是因为请求异步的问题,然后把每次的值添加到一个列表里,在通过索引进行获取,然而还是不对

———最后公司大佬进行解决,是因为js的拷贝问题,js的=赋值会直接把对象的内存地址赋值过去,所以改More_Temp_count_copy这个参数就相当于改this.More_Temp_count,所以才导致问题出现,解决办法呢,就是用深拷贝,直接把对象转为字符串,然后将字符串拷贝过去,这样就不会有赋值失败的问题了,修改一行代码

        // 每次循环重新赋值
        var More_Temp_count_copy = JSON.parse(JSON.stringify(this.More_Temp_count))

问题解决!

<think>我们正在讨论的是在Dynamics 365的JavaScript中使用for循环进行赋值操作。根据用户的问题,我们需要提供在D365的客户端脚本中使用for循环赋值的示例和方法。 根据引用[2]中的代码,我们可以看到在D365的JavaScript中,我们可以通过Xrm.Page.getControl获取控件,然后使用循环来操作控件的选项(如removeOption和addOption)。但是用户的问题是关于赋值操作,所以我们需要更一般化的方法。 在D365的JavaScript中,赋值操作通常包括: 1. 给属性(字段)赋值 2. 给控件赋值(设置显示) 3. 给变量赋值循环中的变量赋值与普通JavaScript相同) 下面我们分别举例说明: 1. 给字段属性赋值: 我们可以使用`Xrm.Page.getAttribute("字段名").setValue();`来给字段赋值。 2. 给控件赋值(设置显示,但注意这通常也是通过设置字段来实现,因为控件绑定字段): 如果控件绑定了字段,那么设置字段就会更新控件。但有时我们可能需要直接操作控件的其他属性(如禁用、设置提示等)。 3. 在循环赋值循环中我们可以对数组或对象进行赋值操作,然后利用这些来设置字段的。 示例1:使用for循环给数组赋值,然后将数组的某个赋给字段 ```javascript // 假设我们有一个字段叫做"new_field" var fieldName = "new_field"; var values = []; // 初始化一个空数组 // 循环给数组赋值 for (var i = 0; i < 5; i++) { values.push(i * 10); // 将0,10,20,30,40放入数组 } // 将数组的第三个元素(索引2)赋给字段 Xrm.Page.getAttribute(fieldName).setValue(values[2]); ``` 示例2:循环给多个字段赋值 假设我们有三个字段:new_field1, new_field2, new_field3,我们想分别赋值为10,20,30 ```javascript var fields = ["new_field1", "new_field2", "new_field3"]; var values = [10, 20, 30]; for (var i = 0; i < fields.length; i++) { Xrm.Page.getAttribute(fields[i]).setValue(values[i]); } ``` 示例3:使用循环计算并赋值 计算1到10的和,然后赋给一个字段 ```javascript var total = 0; for (var i = 1; i <= 10; i++) { total += i; } Xrm.Page.getAttribute("new_total").setValue(total); ``` 注意:在D365的客户端脚本中,我们通常使用Xrm.Page对象模型(对于旧版本)或Xrm.WebApi(在线版)等。但是,在Dynamics 365的最新版本中,推荐使用表单上下文(formContext)而不是Xrm.Page,因为Xrm.Page在未来的版本中可能会被弃用。 因此,如果是在表单脚本中,我们通常这样写(使用formContext): ```javascript function myFunction(executionContext) { var formContext = executionContext.getFormContext(); // 使用formContext代替Xrm.Page var fieldName = "new_field"; formContext.getAttribute(fieldName).setValue("新"); } ``` 在循环中使用formContext的示例: ```javascript function assignValues(executionContext) { var formContext = executionContext.getFormContext(); var fields = ["field1", "field2", "field3"]; var values = [100, 200, 300]; for (var i = 0; i < fields.length; i++) { var attribute = formContext.getAttribute(fields[i]); if (attribute) { attribute.setValue(values[i]); } } } ``` 注意事项: - 在给字段赋值之前,最好检查字段是否存在(如上面的if(attribute))。 - 赋值时要注意数据类型,例如选项集字段(OptionSet)需要赋值数字,而文本字段赋值字符串。 - 循环操作中,如果循环次数很大,要注意性能,因为每次setValue都会触发字段的onChange事件(除非使用setSubmitMode或禁用事件来避免)。 另外,在引用[2]中,我们看到了如何操作下拉框的选项(添加和移除)。如果用户需要循环给下拉框添加选项,可以参考引用[2]中的代码。 根据用户的问题,我们提供了使用for循环进行赋值的方法,包括给单个字段赋值、给多个字段循环赋值、以及计算后赋值。同时,我们强调了使用formContext代替Xrm.Page,并注意数据类型和事件处理。 如果用户的问题是关于循环给下拉框赋值的,那么我们可以参考引用[2]中的代码,但用户的问题没有明确说明,所以我们提供了通用的赋值方法。 最后,我们生成相关问题: §§相关问题§§ 1. 如何在D365 JavaScript中给选项集字段赋值? 2. 如何避免在循环赋值时触发字段的onChange事件? 3. 在D365 JavaScript中如何获取表单上的所有字段并遍历? 4. 如何给D365中的查找字段(Lookup)赋值?</think>在Dynamics 365 JavaScript中,使用for循环进行赋值操作时,需结合表单上下文(formContext)获取字段对象。以下是具体方法和示例: ### 一、基本赋值方法 1. **获取字段对象** 使用`formContext.getAttribute("字段名")`获取字段对象,再通过`setValue()`赋值: ```javascript var field = formContext.getAttribute("字段名"); field.setValue(新); ``` 2. **循环赋值模板** ```javascript for (var i = 0; i < 数组.length; i++) { var fieldName = "前缀_" + i; // 动态构建字段名 var field = formContext.getAttribute(fieldName); if (field) { // 检查字段是否存在 field.setValue(数组[i]); // 赋值 } } ``` ### 二、完整示例 假设需将数组`[10, 20, 30]`分别赋给字段`new_value0`、`new_value1`、`new_value2`: ```javascript function assignValues(executionContext) { var formContext = executionContext.getFormContext(); var values = [10, 20, 30]; // 待赋值的数组 for (var i = 0; i < values.length; i++) { var fieldName = "new_value" + i; // 动态生成字段名 var attribute = formContext.getAttribute(fieldName); if (attribute) { attribute.setValue(values[i]); // 赋值 } else { console.log("字段不存在: " + fieldName); } } } ``` ### 三、关键注意事项 1. **字段名验证** 动态构建字段名时需确保与表单字段逻辑名完全匹配(区分大小写)。 2. **数据类型匹配** - 文本字段:`setValue("字符串")` - 数字段:`setValue(100)` - 选项集:`setValue(选项整数)` 3. **性能优化** 循环次数较多时(如>100次),建议: ```javascript formContext.data.entity.attributes.forEach(function(attribute, index) { if (attribute.getName().startsWith("前缀_")) { attribute.setValue(计算); } }); ``` 4. **调试技巧** 使用`console.log()`输出中间,或通过D365浏览器开发者工具(F12)调试脚本[^1]。 > ⚠️ **重要**:在D365 v9.0+版本中优先使用`formContext`替代已弃用的`Xrm.Page`[^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小僵尸打字员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值