2015-10-15 3 views
0

say У меня есть 3 продукта в корзине, я хочу удалить, скажем, 2 из 3 предметов, после того как первый элемент удален просто отлично, другие предметы не будут удалены. после некоторого тестирования я увидел, что до удаления продукта данные были массивом, а после удаления продукта массив преобразовывался в объект.проблема с удалением объекта из массива

, например: Basket {Klant: Object, Orderlines: Array[0]}

после добавления некоторых элементов: Basket {Klant: Object, Orderlines: Array[3]}

в массиве 3 объекты:

{"Klant":{},"Orderlines":[ 
{"id":"2793","number":1,"membershiptype":"New","lineid":"3521"}, 
{"id":"2802","number":1,"membershiptype":"New","lineid":"3522"}, 
{"id":"2803","number":1,"membershiptype":"New","lineid":"3523"} 
]} 

и после удаления элемента: Basket {Klant: Object, Orderlines: Object}

и в объект все еще 2 объекта:

{"Klant":{},"Orderlines":{ 
"0":{"id":"2793","number":1,"membershiptype":"New","lineid":"3521"} 
"2":{"id":"2803","number":1,"membershiptype":"New","lineid":"3523"} 
}} 

Я попытался сплайсировать и удалить массив, но с тем же результатом. я хочу, чтобы результат:

{"Klant":{},"Orderlines":[ 
{"id":"2793","number":1,"membershiptype":"New","lineid":"3521"}, 
{"id":"2803","number":1,"membershiptype":"New","lineid":"3523"} 
]} 

вот мой код:

function Basket() { 
    this.Klant = {}; 
    this.Orderlines = []; 
    Basketdata = null; 
    // check if we have storage and can use it. 
    if (typeof (Storage) !== "undefined") { 
     Basketdata = sessionStorage.getItem("Basket"); 
     total = sessionStorage.getItem("aantalitems"); 
     $('#aantalitems').html(total); 

     console.log(Basketdata); 
     if (Basketdata != null) { 
       mybasket = JSON.parse(Basketdata); 
       this.Orderlines = mybasket.Orderlines; 
       this.Klant = mybasket.Klant; 
     } 
    } 
    if (Basketdata == null) { 
     Basketdata = {}; 
    } 
    $('a.addcart').on('click', {this: this}, this.addArticle); 
    $('a.remove_cart_item').on('click', {this: this}, this.deleteArticle); 
    $('input.ChangeAmount').on('keyup change', {this: this}, this.changeAmount); 

} 

Basket.prototype = { 
    constructor: Basket, 

deleteArticle: function (event) { 
     var knop = $(event.currentTarget); 
     var mainartikel = $(knop).parents('tr.cart_item'); 
     var id = $(mainartikel).attr('id'); 
     var total = 0; 
     for (var i in event.data.this.Orderlines) { 
       var line = event.data.this.Orderlines[i]; 
       if (line.lineid === id) { 
        console.log(event.data.this.Orderlines[i]); 
        console.log(i); 
        event.data.this.Orderlines[i].delete = 1; 
       } else { 
        total += line.number; 
       } 
     } 
     sessionStorage.setItem("aantalitems", total); 
     $(mainartikel).fadeOut(function() { 
       $(this).remove(); 
     }); 
     sessionStorage.setItem("Basket", JSON.stringify(event.data.this)); 
     event.data.this.sendToServer(event.data.this); 



    }, 
sendToServer: function (object) { 
     $.ajax({ 
       type: "POST", 
       url: '/shop?addtoorder=1', 
       data: JSON.stringify(this), 
       dataType: 'json', 
       databasket: object 
     }).done(function (data) { 
       this.databasket.Orderlines = data.Orderlines; 
       for (var i in this.databasket.Orderlines) { 
        if (this.databasket.Orderlines[i].delete == 1) { 
         //here is the delete 
          //delete this.databasket.Orderlines[i]; 
          this.databasket.Orderlines.splice(i,1); 
        } 
        if (this.databasket.Orderlines[i].update == 1) { 
          this.databasket.Orderlines[i].update = 0; 
          location.reload(); 
        } 
       } 
       sessionStorage.setItem("Basket", JSON.stringify(this.databasket)); 
       $('#totalprice').html(data.total); 
       if (this.databasket.Orderlines.length == 0) { 
        this.Orderlines = []; 

        $('div.content').html('\ 
<div style="float: left;"><b><a href="../../../shop"><img src="../../lib/items/Checkout/template/go-home-icon.png" width="32" height="32" alt="go-home-icon" style="vertical-align: middle;"> Back to the shop</a></b></div>\n\ 
<br><br>No items in basket\n\ 
'); 
       } 
     }); 
    }}; 

, что я пытался до сих пор:

под deleteArticle я попытался изменить: event.data.this.Orderlines[i].delete = 1;

: delete event.data.this.Orderlines[i]

, который также в конечном итоге изменения массива объекта

под sendToServer я попытался как

delete this.databasket.Orderlines[i]; 
this.databasket.Orderlines.splice(i,1); 

который также кончался изменения массива объекта

+0

Можете ли вы создать jsfiddle, чтобы проверить его? – nils

+0

@ nils, я попробую, может потребоваться некоторое время. – KickRAzz

+0

Удаление не похоже на проблему: http://jsfiddle.net/Lfudroe4/ Я думаю, что это имеет какое-то отношение к 'data' переменная, которая исходит из вашего ответа JSON. Кроме того, почему вы удаляете строку заказа на стороне клиента, а не на сервере? – nils

ответ

0

Try:

delete yourObj['Orderlines'] 

var obj = {Basket: {Klant: Object, Orderlines: Array[0]}}; 
 
obj['Orderlines'] = [ 
 
{"id":"2793","number":1,"membershiptype":"New","lineid":"3521"}, 
 
{"id":"2802","number":1,"membershiptype":"New","lineid":"3522"}, 
 
{"id":"2803","number":1,"membershiptype":"New","lineid":"3523"} 
 
]; 
 
document.write('After adding to obj[\'Orderlines\']: ' + obj['Orderlines'] + '<br/>'); 
 
delete obj['Orderlines']; 
 
document.write('After deleting from obj[\'Orderlines\']: ' + obj['Orderlines']);