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