2016-07-13 3 views
0

Итак, я пытаюсь проверить существование недавно перенесенного объекта массива. Я разрабатываю веб-приложение с помощью angularJS.Проверка существования объекта массива

У меня есть массив, который определяется как

vm.data.detail 

Так у меня есть форма, которая позволила пользователю Cr модуля. Модуль содержит информацию о запасе продукта. В моем угловом контроллере есть кнопка, которая будет запускать функцию 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 выбран, а затем добавлен в массив. Теперь массив состоит из двух продуктов.
  3. Когда я тестирую, чтобы добавить новый продукт B, я не знаю, почему массив все еще нажат на новый продукт B. Итак, теперь массив состоит из 3 продуктов (1 продукт A и 2 продукта B) ,

То, что я хотел есть, когда я пытаюсь добавить второй продукт В, массив не будет выталкивается новым продуктом B.

Что я здесь отсутствует? Имели дело с ним часами и не могли понять, что я должен добавить для «проверки».

Обратите внимание: объект, нажавший на массив, уже является правильным. Я просто не знаю, как поставить if if. Похоже, внутри логики все еще не хватает чего-то, но я не мог понять, чего не хватает

Большое вам спасибо за предоставленную помощь.

+0

Я не вижу PHP, так почему тег? – RiggsFolly

+0

Извините за мой плохой сэр, я сделал это неправильно! – Vinfoster0701

+0

выглядит намного сложнее, чем нужно. Нужно посмотреть, как это используется. – charlietfl

ответ

0

Вы совершали простую ошибку, вы делаете проверку else внутри массива, вы должны переместить его наружу.

Советы:

Вы можете использовать Array.prototype.find() метод, чтобы проверить, если элемент существует в массиве, который намного лучше, чем выполнять традиционную для цикла.

Как вы могли заметить, в документации, то найти метод не имеют совместимость с IE и Opera браузеров, так что если вам нужна эта совместимость, вы можете использовать Array.prototype.filter().

Ниже приведен код, с обеими версиями (с найти и фильтра), а также с необходимыми изменениями:

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: '' 
     }); 
    } 
    } 
} 

Я надеюсь, что это помогает!

+1

Сэр. ТЫ ЖЖЕШЬ! Благодаря! – Vinfoster0701

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

Я думаю, что проблема здесь: , потому что продукт является свойством объекта Detail, а продукт не имеет свойства имени, он не соответствует критериям и переходит в состояние 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 
    } 
Смежные вопросы