Как запретить объекту добавлять дублирующее значение и прекратить исключать функцию - PullRequest
1 голос
/ 08 апреля 2020

Эй, ребята, я добавляю данные в массив как объект, но я хотел бы, если есть какой-либо дублирующий код элемента, чтобы он прекратил исключать функцию и возвращал, и если условие истинно, так что он принимает значение конструктора и добавляет его к структура данных

Это то, что я пытаюсь предотвратить добавление значения, но оно не работает так, как я хочу

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

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Есть несколько способов справиться с этим. Ваш выбор должен зависеть от других вариантов использования.

Самый простой способ - определить данные как объект 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;
  }
}

Эта реализация также усложняется, если вы собираетесь изменить массив больше, чем просто добавив элементы

1 голос
/ 08 апреля 2020

Вы можете сопоставить массив 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...