У меня есть один объект, одним из свойств которого является массив объектов, идея состоит в том, чтобы переместить объекты из этого массива в новый, если выполняется одно условие.

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);
    });
}

Проблема, которая у меня есть, заключается в следующем: массив имеет типы объектов, сообщений и комментариев, если массив имеет 2 сообщения и 3 комментария, он должен подтолкнуть к новому массиву 3 комментария и оставить 2 сообщения, но перемещается только 2 Комментарии.

Любая идея. Спасибо за вашу помощь.

3
Miguel Angel Frias 28 Авг 2017 в 16:07

3 ответа

Лучший ответ

Вот как Вы делаете это:

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]

Это пример того, как это можно сделать:

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]

Конкретный вариант использования для вас:

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--;
  }
}
6
Arg0n 28 Авг 2017 в 13:25

Здесь мы идем асинхронный путь, детка:

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]
})

Еще один замечательный ход, условный путь, ура

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
Webwoman 24 Фев 2019 в 13:41

Вы удаляете элементы во время цикла по массиву - это никогда не будет хорошей идеей. Лучший способ решить эту проблему - сначала добавить их в this.comments, а когда завершится foreach, начать зацикливаться на this.comments и удалять из сообщений те, которые находятся в этом массиве.

0
sander 28 Авг 2017 в 13:14