2016-08-23 26 views
0

我的陣列看起來像這樣: 「MODE:ID:A:B」Jquery的基於部分匹配移除陣列條目

["add:123456789:0:0", "del:99887766:0:0", "edit:1471872633890:8845:0", "add:4875125862:1523:NE"] 

當用戶從一個del條目被添加到表中刪除一行陣列。

如果用戶已將新條目添加到表中,則將add條目添加到該數組中。

如果用戶編輯了一個條目,則edit條目將被添加到該數組中。

我的問題是,如果用戶添加,然後刪除同一行,我結束了兩個項目:

["add:123456789:0:0", "del:123456789:0:0"] 

我怎樣才能獲得del覆蓋添加(和/或)編輯條目上的匹配ID?

我已經試過:

rows = rows.map(function(value) { 
    if(value.indexOf(id) > -1) { 
     return false; 
    } 

    return value; 
    }); 

但只是替換「假」,它不會刪除該條目。

任何想法我可以做到這一點?

感謝

+0

使用'.filter()''不.MAP()' –

+0

@ArunPJohny那不是刪除元素的所有實例,但? – Ted

回答

1

jQuery.map會工作。 undefinednull返回值不會被映射。

rows = $.map(rows, function(value) { 
    if(value.indexOf(id) > -1) { 
     return undefined; 
    } 

    return value; 
    }); 

jQuery的地圖回調函數可以返回:

  • 翻譯值,其將被映射到所得到的陣列
  • null或未定義,刪除的項
  • 值的陣列,這將 被平整到全陣列
+0

使用這個返回false到數組''[false,「del:1471958467387:0:0」]' – Tom

+0

是的,我有一個錯誤。'返回undefined'而不是'false' – Joe

+0

這似乎是工作,並遵循類似的方法,我是如何做到這一點..所以我明白了:) – Tom

0

你可以遍歷數組,併爲檢查和更新拆分項目,並重新組裝產品,只需向assingment元素。

此提案只預計一個項目與給定id。如您所願

var data = ["add:123456789:0:0", "del:99887766:0:0", "edit:1471872633890:8845:0", "add:4875125862:1523:NE"], 
 
    id = '123456789'; 
 

 
data.some(function (a, i, aa) { 
 
    var item = a.split(':') 
 
    if (item[1] === id) { 
 
     item[0] = "del"; 
 
     aa[i] = item.join(':'); 
 
     return true; 
 
    } 
 
}); 
 

 
console.log(data);

0

你可以只添加一個FILT呃到底:

rows = rows.map(function(value) { 
    if(value.indexOf(id) > -1) { 
     return false; 
    } 
    return value; 
    }) 
.filter(function(item) {return item;}); 
0

嘗試使用此

rows = $.map(rows, function(value){ 
    if(value.indexOf(id) > -1){ 
     return 'del:' + id; 
    } 
}