我需要在排序時對嵌套陣列進行排序,并且排序鍵是動態的。我正在使用查詢,但它僅適用于純文本。樣本資料:
[
{
"modelId":1,
"modelCode":"model1",
"price":[
{
"PRICE_CODE1":225.01
},
{
"PRICE_CODE2":247.68
},
{
"PRICE_CODE3":298.0
}
]
},
{
"modelId":2,
"modelCode":"model2",
"price":[
{
"PRICE_CODE1":100.01
},
{
"PRICE_CODE2":200.68
},
{
"PRICE_CODE3":300.0
}
]
}
]
預期輸出:
[
{
"modelId":2,
"modelCode":"model2",
"price":[
{
"PRICE_CODE1":100.01
},
{
"PRICE_CODE2":200.68
},
{
"PRICE_CODE3":300.0
}
]
},
{
"modelId":1,
"modelCode":"model1",
"price":[
{
"PRICE_CODE1":225.01
},
{
"PRICE_CODE2":247.68
},
{
"PRICE_CODE3":298.0
}
]
}
]
按照上面的例子排序是 PRICE_CODE1,modelCode 升序。我正在使用以下查詢-
function sortByMultipleKey(keys) {
return function(a, b) {
if (keys.length == 0) return 0; // force to equal if keys run out
key = keys[0]; // take out the first key
if (a[key] < b[key]) return -1; // will be 1 if DESC
else if (a[key] > b[key]) return 1; // will be -1 if DESC
else return sortByMultipleKey(keys.slice(1))(a, b);
}
}
arr.sort(sortByMultipleKey(['PRICE_CODE1','modelCode']))
上面的查詢適用于普通陣列,而不適用于陣列陣列,因為在示例中價格是陣列。如何實作這一目標?
uj5u.com熱心網友回復:
警告:這適用于您擁有的價格陣列結構,但不適用于作為排序鍵的 modelCode。
const data = [
{
"modelId":2,
"modelCode":"model2",
"price":[
{
"PRICE_CODE1":100.01
},
{
"PRICE_CODE2":200.68
},
{
"PRICE_CODE3":300.0
}
]
},
{
"modelId":1,
"modelCode":"model1",
"price":[
{
"PRICE_CODE1":225.01
},
{
"PRICE_CODE2":247.68
},
{
"PRICE_CODE3":298.0
}
]
}
]
function sortData(sortKeys = []) {
data.sort((a,b) => {
for (let sortKey of sortKeys) {
const priceObjA = a.price.find(x => sortKey in x);
const priceObjB = b.price.find(x => sortKey in x);
const priceA = priceObjA && priceObjA[sortKey] || 0;
const priceB = priceObjB && priceObjB[sortKey] || 0;
const result = priceA - priceB;
if (result !== 0) {
return result;
}
}
// fallback for equality
return 0;
})
}
sortData(['PRICE_CODE1']);
console.log(JSON.stringify(data,null,2));
sortData(['PRICE_CODE2']);
console.log(JSON.stringify(data,null,2));
sortData(['PRICE_CODE3']);
console.log(JSON.stringify(data,null,2));
uj5u.com熱心網友回復:
arr.sort(sortByMultipleKey(['PRICE_CODE1','modelCode']))
您sortByMultipleKey需要一個鍵串列,每個鍵描述一個鍵。那不能描述PRICE_CODE1下一個物件的欄位prices。
您實際上是在嘗試提出一種語法來描述分層資料中的任意位置。
而不是這樣做,使用Javascript本身來定義如何找到下一個比較欄位!傳遞可以決議欄位并迭代這些欄位的函式。
下面,我將定義 2 個函式。第一個PRICE_CODE1將從 的元素中提取第一個prices。
function(d) {
for (i = 0; i < d.price.length; d ) {
if ("PRICE_CODE1" in d.price[i]) {
return d.price[i].PRICE_CODE1
}
}
return undefined
}
modelCode 的一個更簡單:
function(d) {
return d.modelCode
}
我還添加了一個具有相同功能的第三個模型,PRICE_CODE1因此這modelCode也是相關的。
function sortByMultiple(field_funcs) {
return function(a, b) {
for (i = 0; i < field_funcs.length; i ) {
fa = field_funcs[i](a)
fb = field_funcs[i](b)
console.log("Comparing " fa " and " fb)
if (fa < fb) return -1;
if (fa > fb) return 1;
if (i 1 == field_funcs.length) return 0
}
}
}
var data = [{
"modelId": 2,
"modelCode": "model2",
"price": [{
"PRICE_CODE1": 100.01
},
{
"PRICE_CODE2": 200.68
},
{
"PRICE_CODE3": 300.0
}
]
},
{
"modelId": 1,
"modelCode": "model1",
"price": [{
"PRICE_CODE1": 225.01
},
{
"PRICE_CODE2": 247.68
},
{
"PRICE_CODE3": 298.0
}
]
},
{
"modelId": 3,
"modelCode": "model3",
"price": [{
"PRICE_CODE1": 225.01
},
{
"PRICE_CODE2": 247.68
},
{
"PRICE_CODE3": 298.0
}
]
}
]
data.sort(sortByMultiple([
function(d) {
for (i = 0; i < d.price.length; d ) {
if ("PRICE_CODE1" in d.price[i]) {
return d.price[i].PRICE_CODE1
}
}
return undefined
},
function(d) {
return d.modelCode
}
]))
console.log(data)
uj5u.com熱心網友回復:
您可以使用 lodash 庫:
_.orderBy( data, [c => c.price[0].PRICE_CODE1, "modelCode"], ["asc", "asc"]);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/366072.html
標籤:javascript 节点.js 反应 打字稿
