从 2 个数组进行排序/过滤

Sorting/Filtering from 2 arrays

本文关键字:排序 过滤 数组      更新时间:2023-09-26

我有这两个数组:

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 数组方法 (ES6)(map/filter/sort),而不是 Jquery、lodash 等。

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

谢谢!

这行得通吗?(编辑:如果你想让我解释它的作用,请发表评论)

// 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'}
// ]

您只需遍历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);