NodeJS Json按子数组排序



我想按对象的子数组对其进行排序。

let partners = [
{
Name: "A",
Sectors: [
{ Code: "AA1", Total: 10 },
{ Code: "AA2", Total: 70 }
]
},
{
Name: "B",
Sectors: [
{ Code: "AA1", Total: 20 },
{ Code: "AA2", Total: 60 }
]
},
{
Name: "C",
Sectors: [
{ Code: "AA1", Total: 40 },
{ Code: "AA2", Total: 50 }
]
}
];

假设我想按道具Sectors进行排序,其中Code = AA1 DESC。结果(道具名称(将是:

C、 B,

或者,如果我需要Code = AA2 DESC,会是A、B、C

我遇到了一些像这样简单的问题:

let sorted = partners.sort((a, b) => a.Sectors.Total - b.Sectors.Total);
sorted.forEach((sortedData) => console.log(sortedData));

这是一个SandBox

以下是将acept改为空的正确答案。

let partners = [
{"Name":"E","Sectors": null}, 
{"Name":"A","Sectors":[{"Code":"AA1","Total":10},{"Code":"AA2","Total":70}]},
{"Name":"B","Sectors":[{"Code":"AA1","Total":20},{"Code":"AA2","Total":60}]},
{"Name":"C","Sectors":[{"Code":"AA1","Total":40},{"Code":"AA2","Total":50}]}, 
{"Name":"D","Sectors": null},
{"Name":"P","Sectors": []}
]
partners.sort((a, b) => {
const get = (arr, key, val) => {
return arr.find(o => o[key] === val) || {};
}

let sA = {}, sB = {}

try {
sA = get(a.Sectors, 'Code', 'AA1')
sB = get(b.Sectors, 'Code', 'AA1')
} catch (e) {}


return !!sB.Total - !!sA.Total || sB.Total - sA.Total 
})
console.log(partners)

您可以使用sortfind方法来实现这一点。在排序中,您需要从Sectors数组中查找具有特定Code的元素,然后比较Total的值。

let partners = [{"Name":"A","Sectors":[{"Code":"AA1","Total":10},{"Code":"AA2","Total":70}]},{"Name":"B","Sectors":[{"Code":"AA1","Total":20},{"Code":"AA2","Total":60}]},{"Name":"C","Sectors":[{"Code":"AA1","Total":40},{"Code":"AA2","Total":50}]}]
partners.sort((a, b) => {
const sA = a.Sectors.find(({ Code }) => Code === 'AA1');
const sB = b.Sectors.find(({ Code }) => Code === 'AA1');
return sB.Total - sA.Total
})
console.log(partners)

您可以采用动态方法,找到所需的排序值。

const
sortBy = (fn, order) => (a, b) => (order === 'ASC' || -1) * (fn(a) - fn(b)),
getValue = code => o => o.Sectors.find(({ Code }) => Code === code)?.Total || 0,
partners = [{ Name: "A", Sectors: [{ Code: "AA1", Total: 10 }, { Code: "AA2", Total: 70 }] }, { Name: "B", Sectors: [{ Code: "AA1", Total: 20 }, { Code: "AA2", Total: 60 }] }, { Name: "C", Sectors: [{ Code: "AA1", Total: 40 }, { Code: "AA2", Total: 50 }] }];
console.log(partners.sort(sortBy(getValue('AA1'), 'DESC')));
console.log(partners.sort(sortBy(getValue('AA2'), 'DESC')));
.as-console-wrapper { max-height: 100% !important; top: 0; }

最新更新