【问题标题】:Update matched key values in two JavaScript objects更新两个 JavaScript 对象中匹配的键值
【发布时间】:2018-07-13 02:19:06
【问题描述】:

我的要求是比较两个对象并将更新的值从第二个对象复制到第一个对象中。 例如:

$scope.obj1={"id" : 1, "name" : "java"}
$scope.obj2={"id" : 1, "name" : "java4you", "gender" : "male"}

compare(destination, bj1, obj2);

目标变量输出:

{"id" : 1, "name" : "java4you"}

以上两个对象包含相同的键但值不同。我必须比较 obj1 和 obj2 并使用匹配的 obj2 值进行更新

【问题讨论】:

  • 你想用相同的键覆盖和返回属性?
  • 在更新“name”字段之前是否需要比较id?如果不是(id 总是相同的)你可以做 angular.extend(destination, obj1, obj2) 这是一个浅拷贝。输出将是 {"id" : 1, "name" : "java4you"}
  • 不完全是@user4219031。 extend 将包括 "gender":"male"
  • @Mike McCaughan 是正确的,如果我使用扩展复制对象属性“性别”:“男性”也添加到我的目标对象。我只想用 obj1 更新 obj2 中的匹配值。我不想要与 obj1 不匹配的其他键、值对。

标签: javascript angularjs


【解决方案1】:

试试这个,

function compare(obj1, obj2)
{
    let obj = {};
    for(let k in obj1)
    {
         obj[k] = obj2[k];
     }
    return obj;
}

用法应该是这样的,

var destination = compare(obj1,obj2);

【讨论】:

  • 感谢您的快速回复。我的问题不熟悉的答案。我的要求是不要比较两个对象。从第二个 obj 复制匹配的键、值并更新第一个对象中的键、值。
  • 然后您可以将比较消除为更新的答案。
【解决方案2】:

不实际提及可以在angularJs中使用的方法,你可以试试这个:

function compare(o1, o2) {
  var biggest = o1;
  
  if (Object.keys(o2).length > Object.keys(o1).length) {
    biggest = o2;
  }

	for (let key in biggest) {
  	if (!biggest.hasOwnProperty(key)) continue;
    
    if (o1[key] != o2[key]) {
    	console.info("Difference in '"+ key +"': "+ o1[key] +" <> "+ o2[key]);
    }
	}
}

var $scope = {};

$scope.obj1 = {"id" : 1, "name" : "java"};
$scope.obj2 = {"id" : 1, "name" : "java4you", "gender" : "male"};

compare($scope.obj1, $scope.obj2);

但是要小心使用它,因为它有很多可能失败的情况。

【讨论】:

    【解决方案3】:

    使用 Angularjs,您可以使用 .equal 进行比较并获得结果,我看不出什么不起作用,或者提供您的代码只会让您得到答案。

    $scope.result = angular.equals($scope.obj1, $scope.obj2);
    if($scope.result === true){    
    $scope.obj1 = $scope.obj2;
    }
    

    【讨论】:

      【解决方案4】:

      您可以在新变量destination 中使用Object.assign() 创建obj1 的副本,并使用Object.keys()array#forEach 遍历obj2 的每个键,并检查destination 中是否存在键,如果存在,将destination中的值更新为obj2的值

      var obj1={"id" : 1, "name" : "java"},
          obj2={"id" : 1, "name" : "java4you", "gender" : "male"}
      
      var updateObjectValue = (obj1, obj2) => {
        var destination = Object.assign({}, obj1);
        Object.keys(obj2).forEach(k => {
          if(k in destination) {
            destination[k] = obj2[k];
          }
        });
        return destination;
      }
      console.log(updateObjectValue(obj1, obj2));

      【讨论】:

      • 感谢您的回复。您的回答是正确的,但在我的情况下,我的 json 对象包含大量元素。它是多个内部对象和 json 数组的组合。循环这么大的 json 对象不是一个好习惯。你能给我提供任何简单的解决方案吗?
      • 我会推荐使用Object.assign(),但除了更新object1中的值之外,它还会引入你可能不想要的object2的所有剩余键。
      【解决方案5】:

      我必须更新 @Bharadwaj 的答案才能为我工作。
      for (... in ...) 语句必须使用 if 语句进行过滤

          var obj1={"id" : 1, "name" : "java"},
              obj2={"id" : 1, "name" : "java4you", "gender" : "male"};
      
          function compare(obj1, obj2) {
            let obj = {};
            for(let k in obj1) {
               if(obj1[k] !== obj2[k]) {
                 obj = Object.assign({}, obj1, obj1[k] = obj2[k]);
               }
               
            }
            return obj;
          }

      【讨论】:

        猜你喜欢
        • 2017-11-26
        • 2020-01-18
        • 2020-09-11
        • 1970-01-01
        • 2022-10-05
        • 1970-01-01
        • 2018-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多