检查数组对象是否存在

时间:2016-07-13 16:05:51

标签: arrays angularjs

所以,我试图检查最近推送的数组对象是否存在。 我正在使用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添加到产品中时,会出现问题。这是条件:

  1. 产品A已经在阵列中。
  2. 选择产品B,然后将其添加到阵列中。现在阵列由2个产品组成。
  3. 当我测试添加新产品B时,我不知道为什么仍然使用新产品B推送阵列。所以现在,该阵列包含3个产品(1个产品A和2个产品B) 。
  4. 我想要的是,当我尝试添加第二个产品B时,新产品B不会推送该阵列。

    我在这里缺少什么?已经处理了几个小时,无法弄清楚我必须为“验证”添加什么。

    请注意,数组推送的对象已经正确。我只是不知道如何把if if。看起来里面的逻辑仍然缺乏某些东西,但我无法弄清楚缺少什么

    非常感谢你给予的帮助。

3 个答案:

答案 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
   }