微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Object.assign 对数据进行第二次循环轰炸

如何解决Object.assign 对数据进行第二次循环轰炸

当我最初加载页面 (PHP) 时,我用 4 个棒球场(当地青年体育组织的场管理日历工具)中每一个的 3 个月数据填充 JSON 对象 calHTML。

calHTML 是这样的:

{
   "Field 1":{
      "Apr 2021":{
         "html":"some html"
      },"May 2021":{
         "html":"more html"
      },"Jun 2021":{
         "html":"even more html"
      }
   },"Field 2":{
      "Apr 2021":{
         "html":"some html"
      },"Field 3":{
      "Apr 2021":{
         "html":"some html"
      },"Field 4":{
      "Apr 2021":{
         "html":"some html"
      },"Jun 2021":{
         "html":"even more html"
      }
   }
}

然后当用户移动到日历上的另一个月份时,我从数据库获取更多数据。它正在获取日历 HTML,我想将其添加到 JSON 对象中。

   $.ajax({
       type: "GET",url: ROOT_URL +"/getBookingMonth",data: "monthToGet="+mo,success: function(json){
        let data = JSON.parse(json);
        console.log(data);
        if(data){
                    $.each(data,function(k,v){
                        console.log('this record');
                        console.log(k);
                        console.log(v);
                        console.log('updating object');
                        let html = v[mo]['html'];
                        let propPath = `["${k}"].["${mo}"].html`;
                        console.log('propPath: ' + propPath);
                        let newCal = Object.assign(calHTML[k],v); <--- BOMBING HERE
                        calHTML = newCal;
                        console.log(calHTML);
                        //calHTML[k][mo]['html'] = v[mo]['html'];
                        return;
                    });

它正在轰炸 let newCal = Object.assign(calHTML[k],v);但仅限于第二次迭代。错误:未捕获的类型错误:无法将未定义或空值转换为对象

为什么会发生这种情况,我该如何解决???

解决方法

我认为您的问题是您没有注意到,当您从 add_filter( 'woocommerce_available_payment_gateways','wp_unset_gateway_by_id',10,2 );` function wp_unset_gateway_by_id( $available_gateways,$products) { global $woocommerce; $unset = false; $product_ids = array('6197'); if( in_array( $product->get_id(),$product_ids ) || ( $product->is_type('variation') && in_array( $product->get_parent_id(),$product_ids ) ) ){ unset( $available_gateways['bacs'] ); return $available_gateways; } } 获取返回值时,它返回的是 Object.assign(calHTML[k],v) 的新值,而不是 calHTML[k] 本身的值,正如你的意思。 此外,calHTML 方法会修改目标本身(例如您的 Object.assign),并且不会像使用 calHTML[k] 那样创建对象的副本并修改它。 所以你有两个选择:

  1. 将两行 {...calHTML[k],...v} 简化为 let newCal = Object.assign(....calHTML = newCal;,因为它直接修改了对象。
  2. Object.assign(calHTML[k],v); 替换为 Object.assign(calHTML[k],v);,并将 {...calHTML[k],...v} 替换为 calHTML = newCal;,这就是导致您出错的原因。

有关 calHTML[k] = newCal; 的详细信息,请参阅 here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。