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 ]
簡而言之,如果某些物件不可用,則按用戶給出的順序在 8 個中跳到下一個物件。
理由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 ]
uj5u.com熱心網友回復:
先做映射,再過濾。
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 ]
uj5u.com熱心網友回復:
希望這是預期的結果。剛剛使用了一個 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; }
uj5u.com熱心網友回復:
您可以使用這種方法:
首先,我們將 的每個元素映射filterdArray到一個order索引,因為這是一項昂貴的操作,而且我們不想在每次重新排列陣列時都運行它。
然后我們按索引對mapped陣列進行排序。order
最后,我們回傳原始物件。
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}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/417908.html
標籤:
上一篇:像這樣修改陣列會是什么樣的回圈?
下一篇:給定一個索引,相應地交換陣列元素
