[英]Arrange an array of object base on the selected id
我正在嘗試根據所選ID排列數組,例如,我有一個[{id:1}, {id:2}, {id:3}, {id:4}, {id:5}]
的數組[{id:1}, {id:2}, {id:3}, {id:4}, {id:5}]
,所選數組為[3,5]; 輸出將是[{id:1}, {id:3}, {id:5}, {id:2}, {id:4}]
我設法在[3,5]
上獲得正確的排列,但是當我添加/更改所選數組的值時,問題不一致
var aData = [{id:1},{id:2},{id:3},{id:4},{id:5}];
var selectedId = [3,5];
let firstArray;
selectedId.forEach(function(id) {
let iIndex = selectedId.indexOf(id);
if (iIndex === 0) {
firstArray = iIndex;
}
array_move(aData, id-1, selectedId[firstArray]-2);
});
function array_move(arr, old_index, new_index) {
if (new_index >= arr.length) {
var k = new_index - arr.length + 1;
while (k--) {
arr.push(undefined);
}
}
arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);
};
這樣就可以了。
let output =aData.filter(obj => selectedId.indexOf(obj.id) > -1).concat(aData.filter(obj => selectedId.indexOf(obj.id) ==-1))
console.log(output)
如果要保持selectedId數組的順序,則可以首先對selectedId數組應用reduce,以從aData中獲取所選項。
然后,將結果與selectedId中不存在的aData元素合並。
let output = selectedId.reduce((arr,elem) =>{
let elemIndex = aData.findIndex(obj => obj.id === elem)
if(elemIndex > -1){
arr.push(aData[elemIndex])
}
return arr
},[])
let finalOutput = output.concat(aData.filter(obj => selectedId.indexOf(obj.id) == -1))
console.log(finalOutput)
首先filter
,然后concat
:
var aData = [{id:1},{id:2},{id:3},{id:4},{id:5}]; var selectedId = [3,5]; aData = aData.filter(({ id }) => selectedId.includes(id)).concat(aData.filter(({ id }) => !selectedId.includes(id))); console.log(aData);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.