2017-06-15 77 views
0

我存儲在localStorage的一個數組,看起來像這樣:Javascript:從存儲在localStorage中的數組中刪除對象?

[ 
    { 
    "location": "westcliff, uk", 
    "stopover": true 
    }, 
    { 
    "location": "westcliff, uk", 
    "stopover": true 
    }, 
    { 
    "location": "southend, uk", 
    "stopover": true 
    }, 
    { 
    "location": "Leigh-on-sea, uk", 
    "stopover": true 
    } 
] 

我有一個按鈕,當我點擊,它會尋找localtion:數組中,它會從陣列中刪除該對象和然後再次存儲在本地存儲中。

按鈕的代碼如下所示:

$(document).on('click', ".cart-del", function() { 
    var retrievedObject2 = localStorage.getItem('waypoints'); 
    var parsedObject2 = JSON.parse(retrievedObject2); 
    var result2 = parsedObject2.filter(function(x){return x.location !== "westcliff, uk"; }); 
    var setLoc2 = JSON.stringify(result2); 
    localStorage.setItem('waypoints', setLoc2); 
}): 

這一切工作正常。

,我有是單擊按鈕時,它會刪除所有「westcliff, uk」對象的問題。

什麼,我需要做的是隻爲每次點擊刪除1個對象!

可能有人請就這個問題諮詢?

在此先感謝。

編輯:

我嘗試這樣做,這不會從數組中刪除任何東西:

$(document).on('click', ".cart-del", function() { 

    var retrievedObject2 = localStorage.getItem('waypoints'); 
    var parsedObject2 = JSON.parse(retrievedObject2); 

    for(var i = 0; i < parsedObject2.length; i++){ 
    if(parsedObject2[i].text == "westcliff, uk"){ 
    parsedObject2.splice(i, 1); 
    break; 
    } 
    } 



    var result2 = parsedObject2;  

    var setLoc2 = JSON.stringify(result2); 
    localStorage.setItem('waypoints', setLoc2); 
    }): 
+3

不要使用'.filter'。編寫一個循環,刪除找到的第一個匹配元素,然後跳出循環。 – Barmar

+0

將數組存儲在localStorage中與此問題完全無關。 – Barmar

回答

1

這是由於您使用的是filter,因此無法及早退出,因此可能不適合此用例。相反,您可以使用常規循環。這是一個例子。

var a = [ 
 
    {text : "foo", n : 1 }, 
 
    {text : "foo", n : 2 } 
 
]; 
 
for(var i = 0; i < a.length; i++){ 
 
    if(a[i].text == "foo"){ 
 
    a.splice(i, 1); 
 
    break; 
 
    } 
 
} 
 
console.log(a);

或者使用findIndex了一個更簡潔的方法:

var a = [ 
 
    {text : "foo", n : 1 }, 
 
    {text : "foo", n : 2 } 
 
]; 
 

 
a.findIndex((obj, i) => { 
 
    if(obj.text === "foo"){ 
 
    a.splice(i,1); 
 
    return true; 
 
    } 
 
}); 
 

 
console.log(a);

+0

你正在使用a.splice(i,1);這隻會刪除{text:「foo」,n:1},所以它不適用於{text:「foo」,n:2}或{text:「foo」,n:3}? –

+0

這不是你說的你想要的嗎?只刪除與條件匹配的第一個元素? –

+0

不是。我說,我需要做的是每次點擊只刪除1個對象!例如:點擊一次,刪除1,再次點擊並刪除另一個等等... –

0

您可以使用find方法而不是過濾方法

parsedObject2.find(function(x,e){ 
    if(x.location == "westcliff, uk") 
    { 
     return x.splice(e,1) 
    } 
}); 
+0

我認爲代碼會和OP的代碼做同樣的事情,它會刪除所有的實例。查看[docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find?v=example#Description)查找,如果不返回true它將執行數組中的所有元素。 –

+0

沒有你錯了以爲 https://jsfiddle.net/qym3027s/看這個 –

+0

是啊,這工作,因爲你'在撥弄return'ed splice'的'的truthy返回值。但在你的答案中的代碼中,你不''返回'。 –

相關問題