簡體   English   中英

根據所選ID排列對象數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM