简体   繁体   English

基于另一个数组对数组进行排序/过滤

[英]Sorting/Filtering on array based on another array

I just posted a question here ( Sorting/Filtering from 2 arrays ) but I ran into a problem because my id's could be random strings: 我刚刚在这里发布了一个问题( 从2个数组进行排序/过滤 ),但由于我的ID可能是随机字符串,所以我遇到了一个问题:

so I have a master array with all the data : 所以我有一个包含所有数据的主数组:

var masterArray = [
        {'id' : 'wedfd', 'title' : 'Title 1'},
        {'id' : 'hji', 'title' : 'Title 2'},
        {'id' : 'sdfds', 'title' : 'Title 3'},
        {'id' : 'fgfgf', 'title' : 'Title 4'},
        {'id' : 'kkd', 'title' : 'Title 5'},
        {'id' : 'jjj', 'title' : 'Title 6'},
        {'id' : 'abc', 'title' : 'Title 7'}
    ];

I get an array with this info : 我得到此信息的数组:

var sortFilterInfo = [
    {'id' : 'jjj', 'sortOrder' : 1},
    {'id' : 'hji', 'sortOrder' : 2},
    {'id' : 'abc', 'sortOrder' : 3}
]

With this information I need an array which gives me this sorted filtered array: ( I am only using native DOM Array methods (ES6) (map/filter/sort) and NOT Jquery,lodash, etc. 有了这些信息,我需要一个数组,该数组为我提供此排序后的过滤后的数组:(我仅使用本机DOM数组方法(ES6)(映射/过滤器/排序)和NOT Jquery,lodash等。

var resultArray = [
    {'id' : 'jjj', 'title' : 'Title 6', 'sortOrder' : 1},
    {'id' : 'hji', 'title' : 'Title 2', 'sortOrder' : 2},
    {'id' : 'abc', 'title' : 'Title 7', 'sortOrder' : 3}
]

Thanks! 谢谢!

You can use map() and find() ( using ES6 arrow notation ) 您可以使用map()find() (使用ES6箭头符号)

 var masterArray = [{ 'id': 'wedfd', 'title': 'Title 1' }, { 'id': 'hji', 'title': 'Title 2' }, { 'id': 'sdfds', 'title': 'Title 3' }, { 'id': 'fgfgf', 'title': 'Title 4' }, { 'id': 'kkd', 'title': 'Title 5' }, { 'id': 'jjj', 'title': 'Title 6' }, { 'id': 'abc', 'title': 'Title 7' }]; var sortFilterInfo = [{ 'id': 'jjj', 'sortOrder': 1 }, { 'id': 'hji', 'sortOrder': 2 }, { 'id': 'abc', 'sortOrder': 3 }] // if `sortFilterInfo` is not sorted then sort it using sort() // sortFilterInfo.sort((a,b) => a.id-b.id) // iterate over `sortFilterInfo` array for generating sorted array var res = sortFilterInfo.map(v => { // get element from `masterArray` based on the id var obj = masterArray.find(v1 => v1.id == v.id); // add sortOrder to the object obj.sortOrder = v.sortOrder; // return updated object return obj; }); document.write('<pre>' + JSON.stringify(res, null, 3) + '</pre>'); 

Or the following with an array of id and later get the index using indexOf() 或以下带有id的数组,然后使用indexOf()获取索引

 var masterArray = [{ 'id': 'wedfd', 'title': 'Title 1' }, { 'id': 'hji', 'title': 'Title 2' }, { 'id': 'sdfds', 'title': 'Title 3' }, { 'id': 'fgfgf', 'title': 'Title 4' }, { 'id': 'kkd', 'title': 'Title 5' }, { 'id': 'jjj', 'title': 'Title 6' }, { 'id': 'abc', 'title': 'Title 7' }]; var sortFilterInfo = [{ 'id': 'jjj', 'sortOrder': 1 }, { 'id': 'hji', 'sortOrder': 2 }, { 'id': 'abc', 'sortOrder': 3 }] // if `sortFilterInfo` is not sorted then sort it using sort() // sortFilterInfo.sort((a,b) => a.id-b.id) // create an array with all id var idArr=masterArray.map(v=>v.id); // iterate over `sortFilterInfo` array for generating sorted array var res = sortFilterInfo.map(v => { // get element from `masterArray` based on the id var obj = masterArray[idArr.indexOf(v.id)]; // add sortOrder to the object obj.sortOrder = v.sortOrder; // return updated object return obj; }); document.write('<pre>' + JSON.stringify(res, null, 3) + '</pre>'); 

Here is a kind of brute force approach. 这是一种蛮力方法。 If sortFilterInfo is in order, this solution will always work. 如果sortFilterInfo正确,则此解决方案将始终有效。 Basically just check (lowest to highest order) if it is within the masterArray, if it is, it is guaranteed to be pushed into the correct place of the result array. 基本上只检查(从最低到最高的顺序)它是否在masterArray中,如果是,则保证将其推入结果数组的正确位置。

var masterArray = [
  {'id' : 'wedfd', 'title' : 'Title 1'},
  {'id' : 'hji', 'title' : 'Title 2'},
  {'id' : 'sdfds', 'title' : 'Title 3'},
  {'id' : 'fgfgf', 'title' : 'Title 4'},
  {'id' : 'kkd', 'title' : 'Title 5'},
  {'id' : 'jjj', 'title' : 'Title 6'},
  {'id' : 'abc', 'title' : 'Title 7'}
];

var sortFilterInfo = [
  {'id' : 'jjj', 'sortOrder' : 1},
  {'id' : 'hji', 'sortOrder' : 2},
  {'id' : 'abc', 'sortOrder' : 3}
];

var resultArray = [];

for(var i = 0; i < sortFilterInfo.length; i++) {
  for(var j = 0; j < masterArray.length; j++) {
    if (sortFilterInfo[i].id === masterArray[j].id) {
      resultArray.push({id : masterArray[j].id, title: masterArray[j].title, sortOrder: sortFilterInfo[i].sortOrder});
    }
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM