2016-03-06 136 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}); 
    } 
    } 
}