最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Move object from one array to another - Stack Overflow

programmeradmin6浏览0评论

I have one object that one of the properties is an array of objects, the idea is to move objects from that array to no new one if one condition is true.

public $onInit(): void {
  this.getTicket();
}
    
public ticket: any; // Object with the array
public comments: any = []; // New array to move the elements
public getTicket(): void {
    this.ticketService
        .getTicketComplete(this.$stateParams.ticketID)
        .then((response: any) => {
            this.ticket = response;
            this.stringToDate(this.ticket);
            this.ticket.messages.forEach((elem, index) => {
                if (elem.type === "comment") {
                    this.ticket.messages.splice(index, 1);
                    thisments.push(elem);
                }
            });
            console.log(this.ticket);
    });
}

The problem that I have is the next one: the array has two types of object, messages and comments. If the array has 2 messages and 3 comments it should push to the new array 3 comments and leave 2 messages, but is moving only 2 comments.

I have one object that one of the properties is an array of objects, the idea is to move objects from that array to no new one if one condition is true.

public $onInit(): void {
  this.getTicket();
}
    
public ticket: any; // Object with the array
public comments: any = []; // New array to move the elements
public getTicket(): void {
    this.ticketService
        .getTicketComplete(this.$stateParams.ticketID)
        .then((response: any) => {
            this.ticket = response;
            this.stringToDate(this.ticket);
            this.ticket.messages.forEach((elem, index) => {
                if (elem.type === "comment") {
                    this.ticket.messages.splice(index, 1);
                    this.comments.push(elem);
                }
            });
            console.log(this.ticket);
    });
}

The problem that I have is the next one: the array has two types of object, messages and comments. If the array has 2 messages and 3 comments it should push to the new array 3 comments and leave 2 messages, but is moving only 2 comments.

Share Improve this question edited Aug 6, 2024 at 16:13 jonrsharpe 122k30 gold badges266 silver badges473 bronze badges asked Aug 28, 2017 at 13:07 Miguel FriasMiguel Frias 2,7108 gold badges34 silver badges55 bronze badges 3
  • 3 Maybe the cause is that you modify the array inside the forEach-loop? – Arg0n Commented Aug 28, 2017 at 13:11
  • 1 You should use the filter() method to filter which type of elements you want to remove after you have inserted your elements in your comments object – Alex Beugnet Commented Aug 28, 2017 at 13:14
  • yeah the idea is loop the array searching for the elements and remove the element from the array and push it in to a new....is there any way to do that outside of the forEach loop....? – Miguel Frias Commented Aug 28, 2017 at 13:15
Add a comment  | 

3 Answers 3

Reset to default 16

This is the way You do it:

var array1 = [1, 2, 3, 4, 5];
var array2 = [];

array1.forEach(function(elem, index) {
  array1.splice(index, 1);
  array2.push(elem);
});

console.log(array1); //[2, 4]
console.log(array2); //[1, 3, 5]

This is an example of how it can be done:

var array1 = [1, 2, 3, 4, 5];
var array2 = [];

for(var i = 0; i < array1.length; i++) {
  array2.push(array1[i]);
  array1.splice(i, 1);
  i--; //decrement i IF we remove an item
}

console.log(array1); //[]
console.log(array2); //[1, 2, 3, 4, 5]

Specific use-case for you:

let messages = this.ticket.messages;
for(let i = 0; i < messages.length; i++) {
  let message = messages[i];
  if (message.type === "comment") {
    this.comments.push(message);
    messages.splice(i, 1);
    i--;
  }
}

You are removing elements as you loop through your array - this is never a good idea. A better way to solve this issue is to add them to this.comments first and when the foreach is finalized, start looping over this.comments and remove those that are in this array out of the messages.

Here we go the async way baby:

var array1 = [1, 2, 3, 4, 5];
var array2 = [];

async function fillArray() {
  array1.forEach(function(elem, index) {
    console.log("elem: ", elem)
    array2.push(elem); 
  })
}

async function emptyArray(){
  fillArray().then(() =>{
    array1.length = 0; 
 })
}

emptyArray().then(() => { 
  console.log("array1: ", array1); //[]
  console.log("array2: ", array2); //[1, 2, 3, 4, 5]
})

An another great move, conditional way, cheer:

var array1 = [1, 2, 3, 4, 5];
var array1Length= array1.length;
var array2 = [];
 
  array1.forEach((elem, index) => {
    array2.push(elem); 
    if(array2.length === array1Length) array1.length=0
  })
  
  console.log("array1: ", array1); //[]
  console.log("array2: ", array2); //[1, 2, 3, 4, 5] 

发布评论

评论列表(0)

  1. 暂无评论