2016-05-30 2 views
0

У меня эта функция в NodeJS, где я фильтровать элементы:Изменения положения элемента массив к началу

// Remove duplicates and expired 
var data = (result[0].concat(result[1]).concat(result[3])).filter((event, index, self) => self.findIndex((t) => { 
        var eventDate = new Date(event.start_time); 
        return t.id === event.id && todayDate.setHours(0,0,0,0) <= eventDate.setHours(0,0,0,0); 
       }) === index) 

       // Remove invalid 
       .filter(function(event){ 
        if(~this.indexOf(event.id)){ 
         return false; 
        } else { 
         return true; 
        } 
       }, result[2]) 

       // Sort array by date 
       .sort(function(a,b) { 
        return new Date(a.start_time).getTime() - new Date(b.start_time).getTime(); 
       }) 

       // Filter promoted 
       // PROBLEM 
       .filter(function(event){ 
        if(~this.indexOf(event.id)){ 
         event.promoted = true; 
         console.log(filtered.indexOf(event)); 
         // MOVE THIS TO TOP 
        } 
        return true; 
       }, result[4]); 

Теперь, в последнем методе фильтра я найти элементы с ID от LIS (результат [4]) и добавить к ним свойство «продвигается».

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

Как я могу это сделать? Потому что использование сплайсинга для меня не сработало

Также любое предложение о качестве этой функции?

Спасибо :)

+0

Можете ли вы показать простой набор данных с вашей последовательностью 'filter.sort.filter' вместе с ожидаемым выходом? – naomik

+0

Ваша функция сортировки должна возвращать '-1',' 0' и '1', если она будет работать надежно – naomik

+0

' .sort' мутирует входной массив, так что вы знаете – naomik

ответ

2

Вы не должны использовать filter изменять элементы массива. Для этого есть map.

Если вы хотите отсортировать элементы по нескольким свойствам, вы можете сделать это вот так.

//clean 
const invalid = result[2], 
    promoted = result[4]; 

var data = result[0] 
    .concat(result[1], result[3]) 
    .filter(dedup) //remove duplicated 
    //set promoted flag 
    .map(event => { 
     event.promoted = promoted.indexOf(event.id) > -1 
     return event 
    }) 
    //sort by promoted then by start_time 
    .sort((a, b) => (b.promoted - a.promoted) || (a.start_time - b.start_time)) 
Смежные вопросы