2015-07-30 3 views
1

У меня есть небольшое приложение Todo здесь: http://jsfiddle.net/ccLm46sn/Javascript: Сдвинуть отфильтрованный массив в существующий массив

два массива, один содержит завершенные задачи, другие архивные задачи.

Всякий раз, когда я выполняю функцию archiveCompleted Я хочу, чтобы все выполненные задачи были перенесены в массив с заархивированными задачами и завершенным массивом, а затем удалены.

Что-то вроде этого:

this.tasks.archived.push({ 
    this.tasks.current.filter(function(task) { 
     return task.completed; 
    }); 
}); 

Но это не работает.

Это здесь прекрасно работает перезапись архивного массива с заполненным массивом:

this.tasks.archived = this.tasks.current.filter(function(task) { 
    return task.completed; 
}); 

Но я не хочу, чтобы переписать архивный массив, просто нажать на что:

Вот сценарий: http://jsfiddle.net/ccLm46sn/

+1

как о - this.tasks.archived = this.tasks.archived.concat (this.tasks.current.filter (function (task) { return task.completed; });) – nril

+0

он работает для меня, пожалуйста, сделайте скрипку с багги кодом –

+0

@TonyRaoulIscaros Его скрипка «работает». Завершите одну задачу, затем архивируйте ее с другой. Первая заполненная задача исчезнет из архивных. – thllbrg

ответ

3

Используйте concat для объединения архивных задач с завершенными.

// assigns to the archived object the completed tasks object 
var completedTasks = this.tasks.current.filter(function(task) { 
    return task.completed; 
}); 
this.tasks.archived = this.tasks.archived.concat(completedTasks); 

Работа fiddle

1

может быть, как это:

this.tasks.archived = this.tasks.archived.concat(this.tasks.current.filter(function(task) { 
      return task.completed; 
     })); 
1

Вот часть я изменил в вашей функции:

var completed_tasks = this.tasks.current.filter(function(task) { 
    return task.completed; 
}); 
for (var i = 0; i < completed_tasks.length; i++) { 
    this.tasks.archived.push(completed_tasks[i]); 
} 

И это, кажется, работает. Вот обновленный JSFiddle: http://jsfiddle.net/ccLm46sn/1/

Я не знаю, является ли это лучшим и изящным решением, но оно работает, насколько я его тестировал.

3

Вы можете изменить функцию следующим образом:

this.tasks.archived.push.apply(this.tasks.archived, 
this.tasks.current.filter(function(task) { 
    return task.completed; 
})); 

.apply используется для объединения массивов здесь рабочий fiddle

+2

Это приятное решение, но скрипка не работает. Вышеприведенный код верен. В скрипке есть дополнительная пара фигурных скобок(). – cezar

+1

@cezar спасибо только что обновил скрипку. – brso05

+2

это лучшее решение. Я никогда не знаком с «push.apply». Thanks @ brso05 –

Смежные вопросы