2016-03-06 3 views
0

У меня есть эти 2 массивы:Сортировка/Фильтрация из 2 массивов

var masterArray = [ 
     {'id' : '1', 'title' : 'Title 1'}, 
     {'id' : '2', 'title' : 'Title 2'}, 
     {'id' : '3', 'title' : 'Title 3'}, 
     {'id' : '4', 'title' : 'Title 4'}, 
     {'id' : '5', 'title' : 'Title 5'}, 
     {'id' : '6', 'title' : 'Title 6'}, 
     {'id' : '7', 'title' : 'Title 7'} 
    ]; 

var sortFilterInfo = [ 
    {'id' : '6', 'sortOrder' : 1}, 
    {'id' : '2', 'sortOrder' : 2}, 
    {'id' : '7', 'sortOrder' : 3} 
] 

С помощью этой информации мне нужен массив, который дает мне этот отсортированный отфильтрованный массив: (Я использую только собственные методы DOM Array (ES6) (карта/фильтр/сортировка) и НЕ Jquery, lodash и т.д.

var resultArray = [ 
    {'id' : '6', 'title' : 'Title 6'}, 
    {'id' : '2', 'title' : 'Title 2'}, 
    {'id' : '7', 'title' : 'Title 7'} 
] 

Благодаря

+0

Так не используя никаких внешние библиотек JavaScript? –

+0

хорошо это был пункт. но до тех пор, пока это не jquery, я не против приносить в другой JS util lib – 29er

+0

- это sortFilterInfo статическое значение или будет динамическим в какой-то момент времени? –

ответ

3

ли эту работу (EDIT:!? комментарий, если вы хотите, чтобы я объяснил, что он делает)

// Create arrays 
var masterArray = [ 
    {'id' : '1', 'title' : 'Title 1'}, 
    {'id' : '2', 'title' : 'Title 2'}, 
    {'id' : '3', 'title' : 'Title 3'}, 
    {'id' : '4', 'title' : 'Title 4'}, 
    {'id' : '5', 'title' : 'Title 5'}, 
    {'id' : '6', 'title' : 'Title 6'}, 
    {'id' : '7', 'title' : 'Title 7'} 
]; 

var sortFilterInfo = [ 
    {'id' : '6', 'sortOrder' : 1}, 
    {'id' : '2', 'sortOrder' : 2}, 
    {'id' : '7', 'sortOrder' : 3} 
] 

var resultArray = new Array(); 

// Sort arrays 
masterArray.sort(function(a, b){return parseInt(a.id)-parseInt(b.id)}); 
sortFilterInfo.sort(function(a, b){return a.sortOrder-b.sortOrder}); 

// Push to array the id of the filter... 
for (var i in sortFilterInfo) { 
    resultArray.push(masterArray[parseInt(sortFilterInfo[i].id)-1]); 
} 

// console.log(resultArray); 
// 
// resultArray = [ 
//  {'id' : '6', 'title' : 'Title 6'}, 
//  {'id' : '2', 'title' : 'Title 2'}, 
//  {'id' : '7', 'title' : 'Title 7'} 
// ] 
+0

wow очень круто, работает как шарм. благодаря! – 29er

+0

Спасибо! Мне было весело это сделать! –

+0

andrew ты выглядишь так, как будто тебе 12. немного гения:) еще раз спасибо – 29er

1

Вы просто пройти через sortFilterInfo массив, а затем срывать элементы из массива мастер.

Вот пример:

function myFunc(master, sortOrder) { 
    var result = []; 

    // Sort sortOrder so it is ordered correctly 
    // The array is cloned so it does not affect 
    // the original array 
    var order = sortOrder.concat().sort(function (a, b) { 
     return a.sortOrder - b.sortOrder; 
    }); 
    // Function to find an item in the master array 
    var find = function (value) { 
     var result = -1; 
     master.some(function (item, index) { 
      if (item.id == value) { 
       result = index; 
       return true; 
      } 
     }); 
     return result; 
    }; 
    // Go through the orderings and pick the items 
    // from the master array 
    order.forEach(function (item) { 
     var index = find(item.id); 
     if (index !== -1) { 
      result.push(master[index]); 
     } 
    }); 
    return result; 
} 
var result = myFunc(masterArray, sortFilterInfo); 
+0

это отлично работает! особенно когда идентификаторы ведущего массива - это не числа, а случайный текст. – 29er

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