javascript - Ta bort objekt från en array och lägg till det i en annan array
Jag visar för användaren en serie div-element med innehåll i och användaren kan ta bort div-elementet från sidan så att de inte längre ser det.
Jag skulle vilja ta samma div-innehåll som togs bort från en array och lägga till det i en annan array som kommer att användas för att fylla en rullgardinslista.
det här är vad jag har:
//Remove function
removeCategory(index: number): void {
this.categories.splice(index, 1);
}
//Array
categories: Array<Item> = [
new Item(1, 'test1'),
new Item(2, 'test2')
];
//New Array to add previous removed item
ddoptions: Array<object> = [];
Är det möjligt att göra ett push-kommando innan splice i removeCategory-funktionen? Jag är inte säker på vad jag ska skicka in eftersom detta ger mig ett fel:
this.ddoptions.push(index);
Svar #1
Uppdaterad för 2020
Med de nyare ES-specifikationerna kan du också använda destruktureringsuppdragsoperatorn på en array, vilket betyder att du inte behöver använda concat eller apply en push-funktion i ett givet sammanhang. Detta fanns faktiskt redan när jag skrev detta ursprungligen, men det är mycket vanligare att se nu.
this.ddoptions.push(...this.categories.splice(index, 1));
Men reglerna ovan gäller fortfarande, att använda push och splice kommer att förändra befintliga arrayer, så concat bör förmodligen fortfarande användas om du vill ha oföränderlighet.
Originalt svar
Du kan koppla in i push-metoden direkt, eftersom splice returnerar det borttagna objektet.
this.ddoptions.push(this.categories.splice(index, 1)[0]);
Metoden splice returnerar faktiskt en array med element som togs bort. I ditt fall tar du bara bort ett element, så koden ovan fungerar. Om du tar bort ett eller flera element kan du lägga till dessa i den andra arrayen med flera metoder.
Genom att använda concat för att generera en ny array:
this.ddoptions = this.ddoptions.concat(this.categories.splice(index, 1));
Detta kan bryta saker eftersom ddoptions inte längre är samma objekt. Det beror på vad du gör och vad Angular gör.
Du kan skicka arrayen som flera argument till push genom att använda push-prototypen.
[].push.apply(this.ddoptions, this.categories.splice(index, 1));
På detta sätt kommer ddoptions att förbli som samma array och kommer att lägga till alla nya element i den.
Svar #2
Array#splice returnerar smidigt en array som innehåller de raderade elementen:
removeCategory (index) {
this.ddoptions.push( this.categories.splice(index, 1)[0] )
}
Visa TypeScript-demonstration
JavaScript-demo:
class Item {
constructor(a, b) { return [a, b] }
}
class Example {
removeCategory (index) {
this.ddoptions.push( this.categories.splice(index, 1)[0] )
}
//Array
categories = [
new Item(1, 'test1'),
new Item(2, 'test2')
]
//New Array to add previous removed item
ddoptions = []
}
var example = new Example()
example.removeCategory(1)
console.log(example.ddoptions)