當我有一個數組,我使用splice
來刪除,比方說,數組的最後一個元素。有沒有機會創建例如一個按鈕,當我點擊它,它撤消了刪除的操作?在編寫代碼並且及時跳回時使用Ctrl + Z一樣?那意味着讓我回到刪除的元素及其所有特徵?如何用拼接「撤銷」刪除的元素?
回答
Array.splice
允許您刪除或插入元素,它還會在刪除時返回刪除的元素。如果您捕捉到刪除的元素,你可以很容易地將其添加回:
let arr = [1,2,3,4,5,6];
// remove 1 element from index 1 ("2")
let removed = arr.splice(1, 1);
// add "2" back to position 1
arr.splice(1, 0, ...removed);
console.log(arr);
如果您沒有訪問ES6的價差操作,您可以使用.shift()
拿到的第一個元素出來的removed
:
let arr = [1,2,3,4,5,6];
// remove 1 element from index 1 ("2")
let removed = arr.splice(1, 1);
// add "2" back to position 1
arr.splice(1, 0, removed.shift());
console.log(arr);
嘿,你能解釋一下,在'arr.splice(1,0,...')行中的3個點是什麼意思......刪除);'? –
當然,我正在使用[Spread語法](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator)將數組展開爲其值。在上面的'remove'代碼中是'[2]','... removed'被擴展爲'2'。如果它是'[2,3,4]'那麼它會擴展到'2,3,4'' –
謝謝。你能否在沒有Spread語法的情況下發布'arr.splice(1,0,... removed)'行?它會是'arr = removed.splice(1,0)?' –
如果您只需要一級撤消,您可以在刪除之前複製數組。如果用戶想要「撤消」,然後恢復陣列回到其以前的化身。
var arr = [1,2,3,4,5,6];
var tempArr;
function removeThing(arr, index) {
tempArr = [arr];
arr.splice(index, 1);
}
function undo() {
arr = tempArr;
}
單擊Delete random item
按鈕將導致從arr
陣列中刪除隨機元素。被刪除的元素被存儲在deleted
陣列中。
點擊Undo deletion
按鈕會將刪除的元素移回到arr
數組中,移入相同的位置。
var arr = [5,1,2,6,4,8,0,7],
stored = arr.slice(),
deleted = [],
btn = document.getElementById('deleteBtn'),
undoBtn = document.getElementById('undoBtn');
btn.addEventListener('click', function(){
var randomElem = Math.floor(Math.random() * arr.length),
deleteElem = arr.splice(randomElem, 1);
deleted.push(...deleteElem);
console.log(arr);
console.log(deleteElem);
});
undoBtn.addEventListener('click', function(){
if (arr.length >= 0 && arr.length < stored.length){
var elem = deleted[deleted.length-1],
index = stored.indexOf(elem);
arr.splice(index, 0, elem);
deleted.pop();
console.log(arr);
}
});
console.log(arr);
<button id='deleteBtn'>Delete random item</button>
<button id='undoBtn'>Undo deletion</button>
我會忍不住來包裝你的陣列在某種可撤銷的效用。例如:
function undoable(value) {
let history = [value];
return {
value() {
return history[history.length - 1];
},
update(func) {
let copy = [...this.value()];
func(copy);
history.push(copy);
return copy;
},
undo() {
history.pop();
return this.value();
}
}
}
您可以使用它來處理撤消行爲。
let array = undoable([]);
array.update(arr => arr.push(2));
// [2]
array.update(arr => arr.push(3));
// [2, 3]
array.undo();
// [2]
如果你調用update
在對待值不變的你能做出這樣更安全,更通用。此時,在傳遞給func
之前,您不需要防守地複製陣列。但是,它會要求您使用方法如filter
和slice
而不是splice
。
- 1. 從數組中刪除元素(拼接)
- 2. 如何撤銷中間文件刪除
- 3. 撤銷SVN刪除./* --force
- 4. 刪除/刪除/撤銷零件
- 5. 無法使用拼接刪除陣列中的元素
- 6. JS - 從陣列中刪除元素(使用拼接的問題)
- 7. 拼接元素
- 8. 拼接元素
- 9. 禁用撤銷創建/刪除NSManagedObject
- 10. 使用Snackbar.Callback撤銷刪除操作
- 11. 刪除WebView的NSUndoManager的撤銷操作
- 12. 在DataGridView上撤銷已刪除的行
- 13. 在Angular/Typescript中刪除/拼接數組中的元素
- 14. 陣列拼接刪除陣列中的所有元素
- 15. 如何使用CRUD實現可撤銷刪除?
- 16. 如何從數組中刪除元素。拼接()的心不是工作
- 17. 在QgraphicsScene上撤銷或刪除線條
- 18. AngularJS:如何使用$銷燬方法來刪除一個元素
- 19. 如何在git commit中撤銷已刪除的文件夾
- 20. 你如何撤銷rails中的刪除腳手架?
- 21. REVOKE_ACCESS:如何刪除'撤銷'繼承的ACE?
- 22. 如何撤銷在Mercurial中的添加/刪除
- 23. 拼接錯誤的元素
- 24. 如何在不使用內置撤銷管理器的情況下撤銷NSManagedObject刪除?
- 25. 如何刪除/刪除元素?
- 26. 如何撤消svn刪除
- 27. 如何管理撤銷刪除與數據庫
- 28. 如何從歷史記錄中刪除撤銷(RevertAllInCurrentGroup?)
- 29. JavaScript刪除比拼接
- 30. 如何刪除SwiftyJSON元素?
「已刪除」元素必須回到與刪除前完全相同的位置嗎? –
是的,那是我的計劃。 –
爲什麼沒有一個對象的數組與一個鍵是「活動」,而不是拼接,只需將其設置爲false – binariedMe