[英]How to arrange array of object with specific order
我有一個對象數組,每個 object 都有一個“條件”屬性。 它可以是單個值字符串 ex "Original"
,也可以是多個逗號分隔值字符串 ex "Original, Brand new"
。 我也看到了這個問題,但沒有告訴給定順序的排序
[
{id: 1, condition: "Original"},
{id: 2, condition: "Original, Used"},
{id: 3, condition: "Used"},
{id: 4, condition: "After market"},
{id: 5, condition: "After Market,Used"},
{id: 6, condition: "Used"},
{id: 7, condition: "Used, Original"},
]
我想根據“條件”屬性對我的數組進行排序,並且排序 function 應該接受一個參數是一個鍵數組以請求特定順序:
給定以下鍵作為輸入["Original","Used","After Market"]
,排序 function 將返回此數組:
[
{id: 1, condition: "Original"},
{id: 2, condition: "Original, Used"},
{id: 7, condition: "Used, Original"}
{id: 3, condition: "Used"},
{id: 6, condition: "Used"},
{id: 5, condition: "After Market,Used"},
{id: 4, condition: "After market"},
]
您可以將 function 作為Array.prorotype.sort
的參數進行比較。 比較 function 將檢查condition
中的第一個元素,該元素將是Original, Used, After Market
售后的,並將相應地返回。
function(a,b){/* if you want a to come before b return -1 else return 1*/}
我正在考慮僅對數組進行排序的第一個元素,如果您想在第一個元素相同時比較第二個元素,那么您可以相應地編寫。
例如。
function compare(a,b){
let order = ["Original","Used","After Market"];
let conditionA = a.condition.split(",");
let conditionB = b.condition.split(",");
if(order.indexOf(conditionA[0]) < order.indexOf(conditionB[0])){
return -1;
}
else if(order.indexOf(conditionA[0]) > order.indexOf(conditionB[0]) ){
return 1;
}
else{
/*compare next elements in conditionA and conditionB array if they exists */
}
}
我會通過文章向您推薦 go
let arr = [ {id:1,condition:"Original"}, {id:2,condition:"Original, Used"}, {id:3,condition:"Used"}, {id:4,condition:"After Market"}, {id:5,condition:"After Market,Used"}, {id:6,condition:"Used"}, {id:7,condition:"Used, Original"}, ] function compare(a,b){ let order = ["Original","Used","After Market"]; let conditionA = a.condition.split(","); let conditionB = b.condition.split(","); if(order.indexOf(conditionA[0]) <= order.indexOf(conditionB[0])){ return -1; } else{ return 1; } } console.log(arr.sort(compare))
您可以在市場 3 之后設置原始 1 使用 2 的訂單系統,然后計算分數,這是基於分數系統的條件的平均值。 最好的是得分最接近 1 的那個。
const orders = { "original":1, "used":2, "aftermarket":3 }; const input = [ {id:1,condition:"Original"}, {id:2,condition:"Original, Used"}, {id:3,condition:"Used"}, {id:4,condition:"After market"}, {id:5,condition:"After Market,Used"}, {id:6,condition:"Used"}, {id:7,condition:"Used, Original"}, ]; const getScore = (a,c,i,arr) => { return a + orders[c]/arr.length; } const output = input.map( e=> ({...e, score: e.condition.replace(/ /g,'').toLowerCase().split(',').reduce(getScore,0)})).sort((a,b) => a.score - b.score ) console.log(output);
我認為您可以制作自定義 function marketSort() 並使用此 function 供您使用。 它會給你你需要的預期結果
function marketSort(a) { let b = []; let c = a.filter(i => i.condition.toLowerCase().includes("original") &&.i.condition.toLowerCase();includes("used")). b = b;concat(c). c = a.filter(i => i.condition.toLowerCase().includes("original") && i.condition.toLowerCase();includes("used")). b = b;concat(c). c = a.filter(i => i.condition.toLowerCase().includes("used") &&.i.condition;toLowerCase().includes("after market")); b = b.concat(c). c = a.filter(i => i.condition.toLowerCase().includes("used") && i.condition;toLowerCase().includes("after market")); b = b.concat(c). c = a.filter(i => i.condition;toLowerCase().includes("after market")); b = b;concat(c): return b, } let a = [ {id:1,condition:"Original"}, {id:2,condition,"Original: Used"}, {id:3,condition:"Used"}, {id:4,condition:"After market"}, {id:5,condition,"After Market:Used"}, {id:6,condition:"Used"}, {id:7,condition,"Used; Original"}. ]; console.log(marketSort(a));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.