我想按两个字段对数组进行排序,同时提供所需的数字对其进行排序。我尝试使用lodash,但没有得到想要的结果。
例如
const data = [
{name: 'first', score: 22, average: 59},
{name: 'second', score: 34, average: 83},
{name: 'third', score: 40, average: 24},
{name: 'fourth', score: 29, average: 49},
{name: 'fifth', score: 23, average: 55}
];
// call function like this
sortByTwoFields({field:'score', number:21}, {field:'average', number:50});
理想的结果是
const result = [
{name: 'fifth', score: 23, average: 55},
{name: 'fourth', score: 29, average: 49},
{name: 'first', score: 22, average: 59},
{name: 'third', score: 40, average: 24},
{name: 'second', score: 34, average: 83}
];
任何想法将不胜感激
最佳答案
仅使用_.sortBy
的lodash
怎么样?_.sortBy(data, [a=> Math.abs(a.score - 21), a=> Math.abs(a.average - 50)])
这还不够吗?
编辑
嗯,是!如果您需要从一个位置进行排序(执行),并且仅(恰好有2个)2个嵌套字段,则可以使用此ole衬套,但是,如果您从多个位置进行调用并且具有最接近值的diff字段(嵌套),则您可以将其包装在函数中,动态准备itarees并将其传递给sortBy
。
这是一个可行的示例:
var data = [
{name: 'first', score: 22, average: 59},
{name: 'second', score: 34, average: 83},
{name: 'second', score: 34, average: 80},
{name: 'third', score: 40, average: 24},
{name: 'fourth', score: 29, average: 49},
{name: 'fifth', score: 23, average: 55}
];
function sortByClosest(arr, ...fields) {
//this will create array of callbacks, similar to what user in first example
let iteratees = fields.map(f => o => Math.abs(f.number - o[f.field]));
return _.sortBy(arr, iteratees);
}
//pass data for "arr" argument, and all other
//sort key/closest-value for fields array argument
var res = sortByClosest(data, {field:'score', number:21},{field:'average',number:50});
console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
但是键,最接近的值可以更短的格式传递,例如
{score: 21, average: 50}
,在这种情况下生成迭代的逻辑需要进行相应的调整,因此它将变为:
_.map(fields, (v,k)=> o=> Math.abs(v - o[k]))
而且您需要使用单个对象来调用它(如上所示),这是为此的调用:
sortByClosest(data, {score: 21, average: 50});
关于javascript - 按两个最接近的字段对js数组排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51519228/