2016-03-06 84 views
1

我刚刚张贴的问题在这里(Sorting/Filtering from 2 arrays),但我遇到了一个问题,因为我的ID可能是随机的字符串:排序/过滤基于另一个阵列

,所以我有一个主阵列中的所有数据:

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

有了这个信息,我需要一个数组,它给了我这个排序筛选数组:(我只使用本地DOM Array方法(ES6)(图/过滤/排序),而不是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} 
] 

谢谢!

+0

你应该张贴你在其他职位的masterArray IDS都是整数尝试什么,以及 – Jan

+0

左右。所以@Andrew Mast的回答非常好。但现在我的身份证号码只是随机字符串 – 29er

+0

下面发布的所有解决方案通常都是O(n^2)或O(n * m)。我想知道是否有更好的解决方案来解决这个问题。 – TeaCode

回答

1

您可以使用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>');

或与 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>');

+0

真棒:)工程伟大thx – 29er

+0

@ 29er:很高兴帮助 –

1

这是一种强制方法。如果sortFilterInfo是有序的,该解决方案将始终有效。基本上只要检查(从最低到最高的顺序),如果它在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}); 
    } 
    } 
}