简体   繁体   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 ]

I have a varOrder as input, which is from 1 to 8. It is always 1-8 but in different order as per user wish.我有一个 varOrder 作为输入,它从 1 到 8。它始终是 1-8,但根据用户的意愿以不同的顺序排列。

Initially the Array have Obj1 to Obj8, but after filter, the Array may or may not have elements, If it has elements, it varies from 1 to 8.最初Array有Obj1到Obj8,但经过过滤后,Array可能有也可能没有元素,如果有元素,则从1到8不等。

what am I looking for is if我要找的是如果

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 ]

In simple, out of 8 in the order give by user, if some objects are not available skip to next object.简而言之,按照用户给出的顺序,如果某些对象不可用,请跳到下一个 object。

The Reasoning for FinalObjects = [ obj6, obj8, obj2, obj5 ] is 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

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

Perform the mapping first, then filter.先做映射,再过滤。

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 ]

Hope this is the expected result.希望这是预期的结果。 just used a for loop刚刚使用了一个 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; }

You can use this approach:您可以使用这种方法:

First, we map each element of filterdArray to an order index, since this is an expensive operation, and we do not want to run it every time we rearrange the array.首先,我们将 filterdArray 的每个元素filterdArray设置为一个order索引,因为这是一项昂贵的操作,而且我们不想在每次重新排列数组时都运行它。

Then we sort the mapped array by the order index.然后我们按order索引对mapped的数组进行排序。

Finally, we return the original objects.最后,我们返回原始对象。

 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