【问题标题】:How to prevent object to add duplicate value and stop excuting function如何防止对象添加重复值并停止执行功能
【发布时间】:2020-07-21 00:43:27
【问题描述】:

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

这是我试图阻止它添加价值但它不能按我想要的那样工作

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);

【问题讨论】:

  • 为什么这个标签是 ES5 但使用的是 ES6 语法?
  • getNo 在哪里以及如何从addItem 调用?
  • 对 es5 感到抱歉,但我想创建一个函数来检查 itemCode 值是否在数据中 function addItem(name,itemCode,stock){ checkDuplicat (itemCode); var Newitem = 新项目(名称、项目代码、库存); data.push(Newitem); }
  • addItem 函数中类似的东西
  • 如果值不重复,那么它应该创建一个构造函数,否则停止函数'

标签: javascript arrays sorting object ecmascript-5


【解决方案1】:

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

最简单的方法是将数据定义为 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 对象将用于直接访问该对象。为此,最好使用类类实现,但如果不使用 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;
  }
}

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

【讨论】:

  • OP 要求在构造函数中检查重复项,而不是在 addItem 函数中,如果他们在其他地方使用构造函数,这可能很重要,期望仍然处理重复的逻辑
【解决方案2】:

您可以将data 数组映射到 itemCodes 并查看它是否包含新项目的 itemCode,如果包含,则为您的构造函数返回一个空对象。然后在您的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

【讨论】:

  • 感谢好友的帮助
  • @Azeez 没问题
猜你喜欢
  • 2020-12-09
  • 2012-12-20
  • 2019-10-22
  • 2017-10-01
  • 2014-09-19
  • 1970-01-01
  • 2022-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多