如何防止对象添加重复值并停止执行函数

How to prevent object to add duplicate value and stop excuting function

嘿伙计们,我正在将数据作为对象添加到数组中,但我想如果有任何重复的项目代码,那么它会停止执行该函数,并且 return 如果条件为真,那么它会采取构造函数值并将其添加到数据结构中

这是我试图阻止它添加值但它无法正常工作的方法

function getNo(b){
for (const [key, value] of Object.entries(data)) {
  let val = value.itemCode;
   if(b === val){
    alert('Its equalt to item code');
     break;}else{ return b;};
}}

----我要的是----- 1) 从 itemCode 构造函数中检查值是否重复 2)如果它是一个重复值,那么它应该显示并警告并停止执行该功能 3)并将此函数添加到 addItem 函数中以检查其是否重复 4)我将值存储在数据数组中

   var item = function(name,itemCode,stock){
        this.name = name;
        this.itemCode = itemCode;
        this.stock = stock;
    }
    
    var data = [];
    
    function addItem(name,itemCode,stock){
        var Newitem = new item(name,itemCode,stock);
        data.push(Newitem);
    }
    
    addItem('BlueTee',100,50);
    addItem('Yellow tee',101,100);
    addItem('BrownTee',102,120);

您可以将 data 数组映射到 itemCodes 并查看它是否包含新项目的 itemCode,如果是,return 为您的构造函数提供一个空对象。然后在您的 addItem 函数中,如果对象为空,您可以选择不将对象添加到数组中。

var item = function(name,itemCode,stock){
    if (data.map(i => i.itemCode).includes(itemCode)) {
        alert("This item has a duplicate itemCode");
        return this;
    }
    this.name = name;
    this.itemCode = itemCode;
    this.stock = stock;
}
    
var data = [];
    
function addItem(name,itemCode,stock){
    var Newitem = new item(name,itemCode,stock);
    if (Newitem.name) data.push(Newitem); // check if an object was created with properties
}
    
addItem('BlueTee',100,50);
addItem('Yellow tee',101,100);
addItem('BrownTee',102,120);
addItem('RedTee',100,70); // this won't be added because of duplicate itemCode
console.log(data); // only contains BlueTee, Yellow tee, and BrownTee objects

有多种方法可以处理这个问题。您的选择应取决于其他用例。

最简单的方法是将数据定义为 javascript 对象而不是数组。这将需要每个对象的键。这看起来像这样:

var data = {};

function addItem(name, itemCode, stock){
  var newItem = new item(name, itemCode, stock);
  if(data[itemCode] === undefined)
    data[itemCode] = newItem;
}

如果您以后打算以数组形式访问数据,那么您可以为每次插入迭代数组。这看起来像这样:

function addItem(name, itemCode, stock){
  var newItem = new item(name, itemCode, stock);
  if(!data.some(function(x => x.itemCode === itemCode)){
    data.push(newItem);
  }
}

这会比正常插入慢,尤其是对于大型数据集。如果您要使用非常大的数据集并且需要能够作为数组访问,那么我会使用两者之间的混合。 javascript 对象将用于直接访问该对象。一个类似于 class 的实现将是首选,但如果不使用 oo,代码将如下所示:

var data = [];
var keys = {};

function addItem(name, itemCode, stock){
  var newItem = new item(name, itemCode, stock);
  if(keys[itemCode] === undefined){
    data.push(newItem);
    keys[itemCode] = data.length - 1;
  }
}

如果您不仅要修改数组而不仅仅是添加元素,此实现也会变得复杂