如何遍历JS对象及其中的所有数组和对象以将其与其副本进行比较?

Sen*_*the 6 javascript underscore.js angularjs

selectedItem在Angular中有一个对象,它包含其他对象和数组.我使用JSON技巧创建一个深层副本:

$scope.editableItem = JSON.parse(JSON.stringify($scope.selectedItem))
Run Code Online (Sandbox Code Playgroud)

然后我editableItem在输入中使用模型,更改内部的一些值.selectedItem不会改变.然后我想通过PATCH所做的所有更改发送,但不发送未更改的字段.所以我需要editableItem从未更改的所有字段中删除selectedItem.

如何有效地做到这一点?我正在考虑使用Underscore以递归方式遍历对象,但我真的想知道在解决它之前它是否是一种好的思考方式.

或者我可能会创建第三个对象,它只包含第二个触摸的字段,动态添加,但我不知道如何处理它.

编辑:为了清楚起见,我希望答案是通用的,并假设最复杂的对象结构成为可能.例如,这个问题的答案都不适用于此,因为它们假设对象只有简单的字段,或者需要分别为每个字段明确设置角度观察器.

Sen*_*the 0

这就是我最终得到的结果。也许它会对某人有所帮助。我使用DeepDiff库。代码在 CoffeScript 中,如果有人需要的话,应该很容易翻译成 JavaScript。

   $scope.getChangesObject = () ->
      selected = $scope.selectedItem
      editable = $scope.editableItem
      changes = {}
      differences = DeepDiff(selected, editable)

      for diff in differences
        formattedPath = ""
        for pathPart, index in diff.path
          if index isnt diff.path.length - 1
            formattedPath += pathPart + "."
          else
            formattedPath += pathPart
        changes[formattedPath] = editable[formattedPath]

      changes
Run Code Online (Sandbox Code Playgroud)