尝试实现如下自定义排序:
// 1. sort by 'value' column, here 'a' (first object) and b (second object) has difference equals to 4.5 or less then 4.5 then,
// consider equal values (even though it's 12.12 and 13.22)
// then 2. sort by 'altValue' column (as equal value found on 'value' column) and then,
// 3. sort by 'name' column (as equal value found on 'altValue').
const validSortEqualityDiffence = 4.5;
const inputArray = [
{ id: 1, name: 'ABC INC.', value: 12.12, altValue: 22.22 },
{ id: 2, name: 'DBC INC.', value: 13.22, altValue: 23.32 },
{ id: 3, name: 'DBC INC.', value: 15.22, altValue: 25.42 },
{ id: 4, name: 'CBC INC.', value: 12.22, altValue: 22.32 },
{ id: 5, name: 'CBC INC.', value: 16.22, altValue: 26.32 },
{ id: 6, name: 'QBC INC.', value: 13.52, altValue: 23.72 },
{ id: 7, name: 'QBC INC.', value: 11.02, altValue: 21.92 },
];
/* 下面的代码因无法在此处找到“b”值而出错 */
_.orderBy(
inputArray,
(a, b) => {
console.log('a,b', a, b); // b is undfined
if (Math.abs(a.value - b.value) <= validSortEqualityDiffence) {
return 0;
}
if (a.value < b.value) {
return -1;
}
return 1;
},
(a, b) => {
console.log('a,b', a, b); // b is undfined
if (Math.abs(a.altValue - b.altValue) <= validSortEqualityDiffence) {
return 0;
}
if (a.altValue < b.altValue) {
return -1;
}
return 1;
},
'name'
);
这里,无法获取“b”对象。 是否有使用 Array.sort 或其他 lodash 方法的替代方法可以帮助实现、按自定义差异进行排序并考虑按列进行多重排序。
谢谢你
Lodash
_.orderBy()
和 Underscore.js _.sortBy()
不采用比较函数,它们采用 iteratee
参数,从元素中提取 。
使用内置的
sort()
方法,并用二次排序代替 return 0;
语句。
const validSortEqualityDiffence = 4.5;
inputArray.sort(
(a, b) => {
if (Math.abs(a.value - b.value) <= validSortEqualityDiffence) {
if (Math.abs(a.altValue - b.altValue) <= validSortEqualityDiffence) {
return 0;
}
if (a.altValue < b.altValue) {
return -1;
}
return 1;
}
if (a.value < b.value) {
return -1;
}
return 1;
});
console.log(inputArray);
<script>
const inputArray = [
{ id: 1, name: 'ABC INC.', value: 12.12, altValue: 22.22 },
{ id: 2, name: 'DBC INC.', value: 13.22, altValue: 23.32 },
{ id: 3, name: 'DBC INC.', value: 15.22, altValue: 25.42 },
{ id: 4, name: 'CBC INC.', value: 12.22, altValue: 22.32 },
{ id: 5, name: 'CBC INC.', value: 16.22, altValue: 26.32 },
{ id: 6, name: 'QBC INC.', value: 13.52, altValue: 23.72 },
{ id: 7, name: 'QBC INC.', value: 11.02, altValue: 21.92 },
];
</script>