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