检查数组对象是不是存在

Posted

技术标签:

【中文标题】检查数组对象是不是存在【英文标题】:Checking array object existence检查数组对象是否存在 【发布时间】:2016-07-13 16:05:51 【问题描述】:

所以,我正在尝试检查最近推送的数组对象是否存在。 我正在使用 angularJS 开发 Web 应用程序。

我有一个定义为

的数组
vm.data.detail

所以我有一个表单可以让用户对模块进行 CRUD。该模块是关于产品库存。在我的角度控制器中有一个按钮可以运行 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 添加到产品中时,会出现此问题。这是条件:

    产品 A 已经在数组中。 选择产品 B,然后将其添加到数组中。现在该数组包含 2 个产品。 当我测试添加一个新产品 B 时,我不知道为什么数组仍然被一个新产品 B 推送。所以现在,该数组包含 3 个产品(1 个产品 A 和 2 个产品 B) .

我想要的是,当我尝试添加第二个产品 B 时,数组不会被新产品 B 推送。

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

请注意,数组推送的对象已经正确。我只是不知道如何放置if else。看起来里面的逻辑还是少了点什么,但是我不知道少了什么

非常感谢您提供的帮助。

【问题讨论】:

我看不到 php 为什么是标签? 对不起我的坏先生,我认为是点击错误:) 看起来比它需要的复杂得多。需要查看视图才能了解它是如何使用的 恐怕如果我添加了视图,它只会使线程混乱先生。但基本上所有必要的东西都已经包含在函数中了。代码中的逻辑看起来缺少什么,但我找不到它的正确逻辑是什么 【参考方案1】:

你犯了一个简单的错误,你在数组里面检查else,你必须把它移到外面。

提示:

您可以使用Array.prototype.find() 方法来检查元素是否存在于数组中,这比执行传统的for-loop要好得多。

您可能已经在文档中注意到,find方法不兼容IE和Opera浏览器,所以如果您需要这种兼容性,可以使用Array.prototype.filter() .

以下是代码,包含两个版本(带有 findfilter)以及必要的修改:

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】:

这是一个基本的逻辑错误。你在做

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

【讨论】:

【参考方案3】:

我认为问题在这里: 因为 Detail 对象上有 product 属性,而 product 没有 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
   

【讨论】:

以上是关于检查数组对象是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

检查对象值是不是存在于 Javascript 对象数组中,如果不存在则将新对象添加到数组

检查对象数组中是不是存在具有特定键值的对象

如何检查 JSON 对象数组中是不是存在键

打字稿:按值检查对象是不是存在于数组中

如何检查 Javascript 中是不是存在字符串/数组/对象? [复制]

如何检查在 C# 的全局类中找到的数组中是不是存在对象