Javascript 更改动态值时复制数组对象

Javascript 更改动态值时复制数组对象,javascript,angularjs,json,Javascript,Angularjs,Json,我制作了一个小的营销应用程序,用户可以选择屏幕,在上面放广告。 接下来是流程,用户选择日期范围并从API获取所有可用印象的免费屏幕。用户选择屏幕并将其添加到购物车。每个屏幕都有可用印象的数据 这是购物车的桌子 |ID | Available impressions (input) | |1000 | 5000 | |1004 | 7855 | |1098 | 9688

我制作了一个小的营销应用程序,用户可以选择屏幕,在上面放广告。 接下来是流程,用户选择日期范围并从API获取所有可用印象的免费屏幕。用户选择屏幕并将其添加到购物车。每个屏幕都有可用印象的数据

这是购物车的桌子

 |ID   | Available impressions (input) |
 |1000 |       5000                    |
 |1004 |       7855                    |
 |1098 |       9688                    |
 |1111 |       1022                    |
 total: 23565 (input field)
这是像我期望的那样工作,这是好的,我将此发布到API,一切都很好

代码:

问题1

问题是,若我们在一行中输入新值,并带有印象,在发送到API之前,再次输入新值,在我的json中,我并没有得到唯一的新值,我得到了之前输入的所有值,就像下面的json一样

{"campaign_items": [
{"id": 1000, "impressions": 5000},//duplicate, this is initial, i don't need this, i need new
{"id": 1004, "impressions": 7855},
{"id": 1098, "impressions": 9688},
{"id": 1111, "impressions": 1022},
{"id": 1000, "impressions": 6000}, //duplicate, when i try to input another number
{"id": 1000, "impressions": 4561}, //i only need this last i entered
]}
如何获得提交前输入的唯一输入,没有之前输入的所有内容,没有重复

问题2

对于这个问题,我仍然没有任何代码,因为我需要这样做,但我需要一些逻辑方面的帮助

若你们看一下表格示例,你们会看到,我有
TOTAL
,还有输入字段。 加载ng表格时,我将所有印象相加,并显示总计。没关系。 每个屏幕都有一个不同的最大总数,例如,如果我在总数字段中输入另一个数字,而不是
23565
,我将输入较低的数字
19000
,我需要均匀地添加到所有选定的屏幕。这里的问题是,
ID1111
的屏幕只有
1022
印象,而
ID9688
的屏幕有
9688
印象。 对我来说,解决方案是,计算初始<代码>总和数字的百分比变化,当我得到结果时,以相同的百分比减少每个屏幕显示。如果有人有任何其他的解决方案,或者对代码有一些想法,请与我们分享


Thnx同样

对于第一个问题,您可以在推送新数据之前删除具有该ID的对象。假设您可以使用
过滤器
功能(否则需要循环)。这样,您将在下一个
push
语句中删除要推送的id

$scope.sendCustomSelectedImpressions = function(id, numberOfImpressions){
      $scope.myCartItems = $scope.myCartItems.filter(item => item.id !== id);

      $scope.myCartItems.push({
        'id': id,
        'campaignImpressions': numberOfImpressions
      });
}

对于第一个问题,可以在推送新数据之前删除具有该ID的对象。假设您可以使用
过滤器
功能(否则需要循环)。这样,您将在下一个
push
语句中删除要推送的id

$scope.sendCustomSelectedImpressions = function(id, numberOfImpressions){
      $scope.myCartItems = $scope.myCartItems.filter(item => item.id !== id);

      $scope.myCartItems.push({
        'id': id,
        'campaignImpressions': numberOfImpressions
      });
}

我认为对于问题1,您可能不需要推送新值,而只需更新$scope.mycarttItems即可

$scope.sendCustomSelectedImpressions (id, numberOfImpressions) {
    if (!numberOfImpressions) return; // Check, if input is not empty (not undegined or null)
    $scope.myCartItems[id - 1].impressions = numberOfImpressions; // change existing object items
};
我用示例制作了一个简单的stackbltz应用程序(Angularjs+ES6)。我希望有帮助:)


我认为对于问题1您可能不需要推送新值,而只需更新$scope.mycarttItems即可

$scope.sendCustomSelectedImpressions (id, numberOfImpressions) {
    if (!numberOfImpressions) return; // Check, if input is not empty (not undegined or null)
    $scope.myCartItems[id - 1].impressions = numberOfImpressions; // change existing object items
};
我用示例制作了一个简单的stackbltz应用程序(Angularjs+ES6)。我希望有帮助:)


谢谢。。。我尝试使用拼接,但过滤器是解决方案。非常感谢。如果有人给我第二个问题的答案,我会接受你的答案…谢谢你。。。我尝试使用拼接,但过滤器是解决方案。非常感谢。sry如果有人给我第二个问题的答案,我将稍后接受您的答案…请注意,此解决方案依赖于与OP用例不完全对应的隐式规则:此处的
id
必须从
1
开始,使用
0
您将拥有
$scope.mycartimes[-1]
这会影响数组长度。它还依赖于ID的连续性,如
var a=[];a[1000]=“测试”在“测试”之前创建1000个空元素。如果OP希望保持显示和当前的
myCartItems
,则此解决方案不会fit@Kaddaththnx的信息。如果我使用track by$index,然后使用
$scope.myCartItems[index]
这是更好的解决方案吗?请注意,此解决方案依赖于与OP用例不完全对应的隐式规则:此处的
id
必须从
1
开始,使用
0
您将拥有
$scope.myCartItems[-1]
这会影响数组长度。它还依赖于ID的连续性,如
var a=[];a[1000]=“测试”在“测试”之前创建1000个空元素。如果OP希望保持显示和当前的
myCartItems
,则此解决方案不会fit@Kaddaththnx的信息。如果我使用track by$index,然后使用
$scope.myCartItems[index]
这是更好的解决方案吗?