簡體   English   中英

如何在 java 腳本中忽略 null 值時對 arrays 進行排序

[英]how to sort arrays while ignoring null values in java script

initialArray = [ obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8 ]; // all eight are uniq objects
filterdArray = [ obj2, obj5, obj6, obj8 ]; // varies from 0 to 8

varOrder = [ 6, 8, 3, 2, 1, 4, 5, 7 ]

我有一個 varOrder 作為輸入,它從 1 到 8。它始終是 1-8,但根據用戶的意願以不同的順序排列。

最初Array有Obj1到Obj8,但經過過濾后,Array可能有也可能沒有元素,如果有元素,則從1到8不等。

我要找的是如果

filterdArray = [ obj2, obj5, obj6, obj8 ]; // and my varOrder is
varOrder = [ 6, 8, 3, 2, 1, 4, 5, 7 ]; // required ouput is like below

FinalObjects = [ obj6, obj8, obj2, obj5 ]

簡而言之,按照用戶給出的順序,如果某些對象不可用,請跳到下一個 object。

FinalObjects = [ obj6, obj8, obj2, obj5 ]的推理是

varOrder | FilteredArray

6 | obj6 available from FilterdArray (obj6)
8 | obj8 available from FilteredArray (obj8)
3 | obj3 is not available from FilteredArray
2 | obj2 is available from FilteredArray (obj2)
1 | obj1 is not available from FilteredArray
4 | obj4 is not available from FilteredArray
5 | obj5 is available from FilteredArray (obj5)
7 | obj7 is not availabe from FilteredArray

因此FinalObjects = [ obj6, obj8, obj2, obj5 ]

先做映射,再過濾。

const varOrder = [ 6, 8, 3, 2, 1, 4, 5, 7 ];
const initialArray = [ obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8 ];

const orderedArray = varOrder.map((idx) => initialArray[idx - 1]);
// [ obj6, obj8, obj3, obj2, obj1, obj4, obj5, obj7 ]

const filteredArray = orderedArray.filter(obj => obj !== null);
// Assume all objects are null except for 6, 8, 2, and 5.
// [ obj6, obj8, obj2, obj5 ]

希望這是預期的結果。 剛剛使用了一個 for 循環

 let obj1 = {name: 'obj1'};let obj2 = {name: 'obj2'};let obj3 = {name: 'obj3'};let obj4 = {name: 'obj4'};let obj5 = {name: 'obj5'};let obj6 = {name: 'obj6'};let obj7 = {name: 'obj7'};let obj8 = {name: 'obj8'} initialArray = [ obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8 ]; // all eight are uniq objects filterdArray = [ obj2, obj5, obj6, obj8 ]; // varies from 0 to 8 varOrder1 = [ 6, 3, 8, 2, 1, 4, 5, 7 ]; varOrder2 = [ 7, 5, 4, 1, 2, 8, 3, 6 ]; let finalArr1 = []; let finalArr2 = []; const sorter = (varOrder) => { let finalArr = [] for (let i = 0; i < varOrder.length; i++) { if (filterdArray.includes(initialArray[varOrder[i]-1])){ finalArr.push(initialArray[varOrder[i]-1]) } } return finalArr; } console.log(sorter(varOrder1)) console.log(sorter(varOrder2))
 .as-console-wrapper { max-height: 100%;important: top; 0; }

您可以使用這種方法:

首先,我們將 filterdArray 的每個元素filterdArray設置為一個order索引,因為這是一項昂貴的操作,而且我們不想在每次重新排列數組時都運行它。

然后我們按order索引對mapped的數組進行排序。

最后,我們返回原始對象。

 const initialArray = [{n:'obj1'}, {n:'obj2'}, {n:'obj3'}, {n:'obj4'}, {n:'obj5'}, {n:'obj6'}, {n:'obj7'}, {n:'obj8'}]; const filterdArray = [{n:'obj2'}, {n:'obj5'}, {n:'obj6'}, {n:'obj8'}]; const order = [ 6, 8, 3, 2, 1, 4, 5, 7 ]; const mapped = filterdArray.map((obj) => ( { obj, order: order.at(initialArray.findIndex((item)=> item.n === obj.n)) })); console.log('mapped >>', mapped); const sortedByOrder = mapped.sort((o1, o2) => o1.order - o2.order).map(({obj}) => obj); console.log('sortedByOrder >>', sortedByOrder);
 .as-console-wrapper {max-height: 100%;important: top: 0}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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