【问题标题】:Update an array of objects with a different array of objects data使用不同的对象数据数组更新对象数组
【发布时间】:2023-03-04 16:28:02
【问题描述】:

我有一个非常棘手的操作要做。就是这样。

我有一个名为“data1”的对象数组

[Object, Object, Object]
       0:Object
               id="00456145"     //check this 
               name: "Rick"
               upper:"0.67"
               lower:"-0.34"
      1:Object
               id="00379321"     
               name:"Anjie"
               upper:"0.46"
               lower:"-0.56"
      2:Object
               id="00323113"      
               name:"dillan"
               upper:"0.23"
               lower:"-0.11"

我只对这些对象数组中的 id、上限值和下限值感兴趣。

这是名为“data2”的第二个对象数组

[Object, Object]
     0:Object
             id="0045614"   //present here if we remove last element of '00456145'
             cast="Rick"
             Contact: "Yes"
             upper:"0.11"    //need to be updated to '0.67'
             lower:"-0.11"   //need to be updated to '-0.34'
     1:Object
             id="0032311"     //present here if we remove last element of '00323113'
             cast:"dillan"
             Contact:"Maybe"
             upper:"0.11"
             lower:"-0.11"

所以,这就是我必须做的。我将首先检查'data1'。检查“data1”中存在的 id。例如对象 0 的 id="00456145"

我删除了其中的最后一个数字。所以它变成了 id="0045614"。 然后我比较对象'data2'中是否存在此ID。

如果存在,则“data1”中该对象 0 的上限值和下限值将传递给 id 存在的对象“data2”。在这种情况下,“data2”的对象 0 的 id=“0045614”。

所以上限和下限将分别更新为 0.67 和 -0.34。

对于其他数组也是如此。所以最终的输出应该是 'data2' 的样子

[Object, Object]
     0:Object
             id="0045614"   
             cast="Rick"
             Contact: "Yes"
             upper:"0.67"    //updated
             lower:"-0.34"   //updated
     1:Object
             id="0032311"  
             cast:"dillan"
             Contact:"Maybe"
             upper:"0.23"      //updated
             lower:"-0.11"     //updated

【问题讨论】:

    标签: javascript arrays loops object underscore.js


    【解决方案1】:

    我喜欢这种情况下的array#some,这样你就可以跳出循环,避免不必要的迭代:

    var data1 = [{ id: "00456145", name: "Rick", upper: "0.67", lower: "-0.34" }, { id: "00379321", name: "Anjie", upper: "0.46", lower: "-0.56" }, { id: "00323113", name: "dillan", upper: "0.23", lower: "-0.11" }];
    var data2 = [{ id: "0045614", cast: "Rick", Contact: "Yes", upper: "0.11", lower: "-0.11" }, { id: "0032311", cast: "dillan", Contact: "Maybe", upper: "0.11", lower: "-0.11" }];
    
    data2 = data2.map(function(item) {
      data1.some(function(a) {
        if (item.id == a.id.slice(0, -1)) {
          item.upper = a.upper;
          item.lower = a.lower;
          return true;
        }
      });
    
      return item;
    });
    
    console.log(data2);

    【讨论】:

      【解决方案2】:

      我建议使用对象作为哈希表或映射。那么只需要两个循环,一个用于获取引用,一个用于分配。

      大 O: O(n + m)

      虽然我实际上不知道哪个(地图与对象)更适合,但您可能会得到自己的照片:

      Object的提案

      var data1 = [{ id: "00456145", name: "Rick", upper: "0.67", lower: "-0.34", }, { id: "00379321", name: "Anjie", upper: "0.46", lower: "-0.56", }, { id: "00323113", name: "dillan", upper: "0.23", lower: "-0.11" }],
          data2 = [{ id: "0045614", cast: "Rick", Contact: "Yes", upper: "0.11", lower: "-0.11", }, { id: "0032311", cast: "dillan", Contact: "Maybe", upper: "0.11", lower: "-0.11" }],
          hash = Object.create(null);
      
      data1.forEach(function (a) {
          hash[a.id.slice(0, -1)] = a;
      });
      
      data2.forEach(function (a) {
          var o = hash[a.id];
          o && Object.keys(o).forEach(function (k) {
              if (k !== 'id' && a[k] !== o[k]) {
                  a[k] = o[k];
              }
          });
      });
      
      console.log(data2);

      Map的提案

      var data1 = [{ id: "00456145", name: "Rick", upper: "0.67", lower: "-0.34", }, { id: "00379321", name: "Anjie", upper: "0.46", lower: "-0.56", }, { id: "00323113", name: "dillan", upper: "0.23", lower: "-0.11" }],
          data2 = [{ id: "0045614", cast: "Rick", Contact: "Yes", upper: "0.11", lower: "-0.11", }, { id: "0032311", cast: "dillan", Contact: "Maybe", upper: "0.11", lower: "-0.11" }],
          map = new Map;
      
      data1.forEach(function (a) {
          map.set(a.id.slice(0, -1), a);
      });
      
      data2.forEach(function (a) {
          var o = map.get(a.id);
          o && Object.keys(o).forEach(function (k) {
              if (k !== 'id' && a[k] !== o[k]) {
                  a[k] = o[k];
              }
          });
      });
      
      console.log(data2);

      【讨论】:

        【解决方案3】:

        也许这就是你想要的。

        var data1 = [{
          id: "00456145",
          name: "Rick",
          upper: "0.67",
          lower: "-0.34"
        }, {
          id: "00379321",
          name: "Anjie",
          upper: "0.46",
          lower: "-0.56"
        }, {
          id: "00323113",
          name: "dillan",
          upper: "0.23",
          lower: "-0.11"
        }];
        
        var data2 = [{
          id:"0045614",
          cast:"Rick",
          Contact: "Yes",
          upper:"0.11",
          lower:"-0.11",
        }, {
          id:"0032311",
          cast:"dillan",
          Contact:"Maybe",
          upper:"0.11",
          lower:"-0.11",
        }];
        
        
        data2.forEach(function(data2Value) {
          data1.forEach(function(data1Value) {
            if(data1Value.id.substr(0, data1Value.id.length - 1) === data2Value.id) {
              data2Value.upper = data1Value.upper;
              data2Value.lower = data1Value.lower;
            }
          });
        });
        
        console.log(data2);

        【讨论】:

          【解决方案4】:

          你可以试试这样的:

          for (var i = 0; i < data1.length; i++) {
            var item = data1[i];
            var trim = item.id.substr(0, item.id.length - 1);
            for (var j = 0; j < data2.length; j++) {
              var item2 = data2[j];
              if (item2.id === trim) {
                item2.upper = item.upper;
                item2.lower = item.lower;
              }
            }
          }
          

          如果你使用的是 es6,你可以通过以下方式简化代码:

          for (let item of data1) {
            let trim = item.id.substr(0, item.id.length - 1);
            for (let item2 of data2) {
              if (item2.id === trim) {
                item2.upper = item.upper;
                item2.lower = item.lower;
              }
            }
          }
          

          【讨论】:

            【解决方案5】:

            你可以使用类似的东西

              data1.forEach(function(obj) {
                  var search = obj.id.slice(0, -1);
                  data2.forEach(function(d) {
                      if (d.id === search) {
                          d.upper = obj.upper;
                          d.lower = obj.lower;
                      };
                  });
              });
            

            这样做。

            【讨论】:

            • hecotr, wat 是你提到的function()中的obj和d。
            • 这些是数组的各个对象。 obj 将在 forEach 循环的每次迭代中分别给出索引 0、1、2 处的对象。同样,d 使您可以访问数组 data2 的各个对象。
            【解决方案6】:

            这是使用Array.prototype.forEach 的解决方案。循环遍历data2 对象,如果 id 与data1 中的任何对象匹配,则使用匹配的对象更新值。

            var data1 = [{
                id: "00456145",
                name: "Rick",
                upper: "0.67",
                lower: "-0.34"
              }, {
                id: "00379321",
                name: "Anjie",
                upper: "0.46",
                lower: "-0.56"
              }, {
                id: "00323113",
                name: "dillan",
                upper: "0.23",
                lower: "-0.11"
              }];
            
              var data2 = [{
                id: "0045610", //present here if we remove last element of '00456145'
                cast: "Rick",
                Contact: "Yes",
                upper: "0.11", //need to be updated to '0.67'
                lower: "-0.11" //need to be updated to '-0.34'
              }, {
                id: "0032311", //present here if we remove last element of '00323113'
                cast: "dillan",
                Contact: "Maybe",
                upper: "0.11",
                lower: "-0.11"
              }];
            
            data2.forEach(function(item2){
               data1.forEach(function(item1){
               if (item1.id.substring(0,7) === item2.id){ // can be `item1.id.indexOf(item2.id) == 0
                 item2.upper = item1.upper;
                 item2.lower = item1.lower;
               }
              });
            });
            
            console.log(data2);
            

            【讨论】:

            • 这行得通吗?函数(item2)和函数(item1)。对 wat 有点困惑的是那些指的是
            • forEach 循环将遍历数组的项目/对象。因此,每次迭代时,数组中的一个对象都会传递给匿名回调函数。 item2 是 data2 数组中的一个对象,item1 是 daat1 中的一个对象。
            猜你喜欢
            • 2021-04-29
            • 1970-01-01
            • 2021-07-08
            • 2023-02-10
            • 1970-01-01
            • 2015-07-10
            • 2018-11-25
            • 2022-11-16
            • 2015-05-12
            相关资源
            最近更新 更多