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以递归方式遍历对象,但我真的想知道在解决它之前它是否是一种好的思考方式.
或者我可能会创建第三个对象,它只包含第二个触摸的字段,动态添加,但我不知道如何处理它.
编辑:为了清楚起见,我希望答案是通用的,并假设最复杂的对象结构成为可能.例如,这个问题的答案都不适用于此,因为它们假设对象只有简单的字段,或者需要分别为每个字段明确设置角度观察器.
这就是我最终得到的结果。也许它会对某人有所帮助。我使用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)