所以,我试图检查最近推送的数组对象是否存在。 我正在使用angularJS开发Web应用程序。
我有一个定义为
的数组vm.data.detail
所以我有一个表单允许用户CRUD一个模块。该模块是关于产品库存采取。有一个按钮将在我的角度控制器中运行addProduct()函数。
addProduct函数:
function addProduct() {
//to check whether the array is empty.
if (vm.data.detail.length == 0) {
vm.data.detail.push({
product: vm.data.product_id.selected,
current_qty: vm.data.product_id.selected.qty,
new_qty: Number(vm.data.product_id.selected.qty) - Number(1),
difference: Number(vm.data.product_id.selected.qty) - (Number(vm.data.product_id.selected.qty) - Number(1)),
remarks: ''
});
console.log("Product just been added");
}
//if the array is not empty
else {
for (var i = 0; i < vm.data.detail.length; i++) {
//to check whether the selected product is already inside the array
if (vm.data.product_id.selected.name == vm.data.detail[i].product.name) {
console.log("same product selected");
//data
}
//if there is no selected product inside the array, then add it
else {
console.log("different product has just been selected");
vm.data.detail.push({
product: vm.data.product_id.selected,
current_qty: vm.data.product_id.selected.qty,
new_qty: 0,
difference: 0,
remarks: ''
});
}
}
}
}
当数组只包含一个产品时,上面的代码很有效。当我尝试将另一个产品B添加到产品中时,会出现问题。这是条件:
我想要的是,当我尝试添加第二个产品B时,新产品B不会推送该阵列。
我在这里缺少什么?已经处理了几个小时,无法弄清楚我必须为“验证”添加什么。
请注意,数组推送的对象已经正确。我只是不知道如何把if if。看起来里面的逻辑仍然缺乏某些东西,但我无法弄清楚缺少什么
非常感谢你给予的帮助。
答案 0 :(得分:0)
这是一个基本的逻辑错误。你在做什么
for each element {
if element is different from given {
add given to array
}
}
您需要做的是
var allElementsDifferentFromGiven = true
for each element {
if element is same as given {
allElementsDifferentFromGiven = false
break
}
}
if (allElementsDifferentFromGiven) {
add given to array
}
但JavaScript数组有方法可以做到这一点:
if (array.every(function(element) {
return true if element is different given
})) {
add given to array
}
答案 1 :(得分:0)
你犯了一个简单的错误,你正在对阵列中的else
进行检查,你必须把它移到外面。
<强>提示:强>
您可以使用Array.prototype.find()方法检查元素是否存在于数组中,这比执行传统 for-loop 要好得多。
您可能已在文档中注意到,查找方法与IE和Opera浏览器无法兼容,因此如果您需要此兼容性,则可以使用{{3 }}
下面是代码,包含两个版本(查找和过滤器)以及必要的修改:
function addProduct() {
//to check whether the array is empty.
if (!vm.data.detail.length) { // you can simply use (!length) instead of comparing with 0
vm.data.detail.push({
product: vm.data.product_id.selected,
current_qty: vm.data.product_id.selected.qty,
new_qty: Number(vm.data.product_id.selected.qty) - Number(1),
difference: Number(vm.data.product_id.selected.qty) - (Number(vm.data.product_id.selected.qty) - Number(1)),
remarks: ''
});
console.log("Product just been added");
}
//if the array is not empty
else {
// if there's no obj with the same name inside the array, it returns undefined, otherwise it returns the object.
var obj = vm.data.detail.find(function(value) {
return value.product.name == vm.data.product_id.selected.name;
});
/* Using FILTER:
var obj = vm.data.detail.filter(function(value) {
return value.product.name == vm.data.product_id.selected.name;
})[0];
*/
// Now you can test, if the object exists
if (obj) {
console.log("same product selected");
}
//if there is no selected product inside the array, then add it
else {
console.log("different product has just been selected");
vm.data.detail.push({
product: vm.data.product_id.selected,
current_qty: vm.data.product_id.selected.qty,
new_qty: 0,
difference: 0,
remarks: ''
});
}
}
}
我希望它有所帮助!
答案 2 :(得分:-1)
我认为问题在这里: 因为产品是Detail对象上的属性而产品没有name属性,所以它不匹配条件并转到else条件并进入名单列表。
//to check whether the selected product is already inside the array
if(vm.data.product_id.selected.name == vm.data.detail[i].product.name){
应该是
//to check whether the selected product is already inside the array
if(vm.data.product_id.selected.name == vm.data.detail[i].product){
console.log("same product selected");
//data
}