【问题标题】:Getting a circularity error when copying object from one array to another将对象从一个数组复制到另一个数组时出现循环错误
【发布时间】:2023-02-24 12:06:17
【问题描述】:

你好,

我有这段代码:

    var array1 = {"id":"car", "name":"honda", "virtues":[{"price":99}, {"size" : 5}, {"condition" : 8}, {"features" : 3}]};
    
    var array2 = {'userid' : '2', 'username' : 'john','prefs' : [{"price":1}, {"condition" : 0}]};
    
    calceffect = function(array) {
 array.map(x => {
  for(var key in x) {
   if(key!= 'size') {
    array2.prefs.map(d => 
     {
      for(let k in d) {
       if(k == key){
        if(d[k] == 0) {
                 d = x;
                } else {
                 console.log(key+' is already present');
                }
       } else {
        array2.prefs.push(x);
       }
      }
     }
    );
   }
  }
 });
}

calceffect(array1.virtues);
console.log(array2.prefs);

此函数应比较 2 个给定数组中包含的 2 个对象数组并搜索匹配项。如果第二个数组中不存在其中一个对象,则应按原样添加对象,如果存在对象但其值编号为 0,则将 0 更改为原始数组中的值,最后如果存在但值编号更大比 0 则什么都不做。

它把前两件事做对了,但第三件事却不是这样,因为尽管它已经存在了,但它还是添加了对象(在这种情况下是价格)。此外,它在末尾添加了许多[圆形对象对象]。为什么会这样?

谢谢。

【问题讨论】:

    标签: javascript arrays javascript-objects


    【解决方案1】:

    即使对象已经存在于第二个数组中,函数仍在添加对象的原因是 for (let k in d) 循环中的 else 块在每次循环迭代不匹配的键时执行。这会导致函数为每个不匹配的键将对象添加到 prefs 数组,这会导致 prefs 数组中出现重复的对象。

    要解决此问题,您可以将 array2.prefs.push(x) 行移到 for (let k in d) 循环之外,而是添加一个标志来指示该对象是否已添加到 prefs 数组中。

    function calceffect(array) {
      array.map(x => {
        let added = false;
        for (let key in x) {
          if (key != 'size') {
            array2.prefs.map(d => {
              for (let k in d) {
                if (k == key) {
                  if (d[k] == 0) {
                    d[k] = x[key];
                    added = true;
                  } else {
                    console.log(key + ' is already present');
                    added = true;
                  }
                }
              }
            });
            if (!added) {
              array2.prefs.push(x);
            }
          }
        }
      });
    }
    

    除了重复对象的问题之外,还打印了循环引用,因为console.log 正在尝试打印包含循环引用的对象。当一个对象包含一个引用对象本身的属性时,就会发生这种情况。在这种情况下,循环引用可能是由于 prefs 数组包含引用 array2 对象的对象,然后引用 prefs 数组。为避免打印循环引用,您可以在打印之前使用JSON.stringify 将对象转换为字符串。以下是如何使用 JSON.stringify 打印 prefs 数组的示例:

    console.log(JSON.stringify(array2.prefs, null, 2));
    

    这会将 prefs 数组打印为格式化的 JSON 字符串,每个对象单独一行并缩进 2 个空格。

    【讨论】:

      猜你喜欢
      • 2018-10-12
      • 1970-01-01
      • 2013-02-12
      • 2013-05-28
      • 1970-01-01
      • 2022-07-05
      • 2018-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多