尝试使用 TimSort 对对象数组进行排序时返回 'undefined'
Getting 'undefined' returned when trying to sort array of objects with TimSort
这是一个非常接近我在我的项目中尝试实现的代码片段:https://repl.it/@Twinbird24/TimSort-example
var timsort = require('timsort');
const arr = [
{
name: 'Amy',
age: 23
},
{
name: 'Bob',
age: 34
},
{
name: 'Cary',
age: 18
}
];
function sort(objectsArr, sortBy, sortOrder = 'ascending') {
function stringCompare(a, b) {
return a.sortBy - b.sortBy;
}
return timsort.sort(objectsArr, stringCompare);
}
const sortedArr = sort(arr, 'name');
console.log(sortedArr);
这是我正在使用的包:https://www.npmjs.com/package/timsort
我正在尝试按每个对象的名称 属性 对我的对象数组进行排序,该名称包含一个字符串——尽管我的函数也可以传递另一个项目进行排序(即 'age') .
TimSort 的文档不是很清楚,查看源代码我仍然不太清楚如何配置我的代码。
您会在我的代码中注意到,我还想选择按 'ascending' 或 'descending' 排序,但我不确定如何将其添加到 TimSort 方法中使用。
您的字符串比较不会比较字符串。它仅适用于数字类型或具有 valueOf
的类型,例如 Date.
也许如果你把它改成a < b ? -1 : a > b ? 1 : 0
,效果会好一些。那么这个怎么样?:
function sort(objectsArr, sortBy, sortOrder = 'ascending') {
function stringCompare(a, b) {
const left = a[sortBy], right = b[sortBy];
return left < right ? -1 : left > right ? 1 : 0;
}
return timsort.sort(objectsArr, stringCompare);
}
这仍然没有回答您 ascending/descending 的问题。从这里应该很简单,但是如果你不能得到它,请再问一个问题。
这是一个非常接近我在我的项目中尝试实现的代码片段:https://repl.it/@Twinbird24/TimSort-example
var timsort = require('timsort');
const arr = [
{
name: 'Amy',
age: 23
},
{
name: 'Bob',
age: 34
},
{
name: 'Cary',
age: 18
}
];
function sort(objectsArr, sortBy, sortOrder = 'ascending') {
function stringCompare(a, b) {
return a.sortBy - b.sortBy;
}
return timsort.sort(objectsArr, stringCompare);
}
const sortedArr = sort(arr, 'name');
console.log(sortedArr);
这是我正在使用的包:https://www.npmjs.com/package/timsort
我正在尝试按每个对象的名称 属性 对我的对象数组进行排序,该名称包含一个字符串——尽管我的函数也可以传递另一个项目进行排序(即 'age') .
TimSort 的文档不是很清楚,查看源代码我仍然不太清楚如何配置我的代码。
您会在我的代码中注意到,我还想选择按 'ascending' 或 'descending' 排序,但我不确定如何将其添加到 TimSort 方法中使用。
您的字符串比较不会比较字符串。它仅适用于数字类型或具有 valueOf
的类型,例如 Date.
也许如果你把它改成a < b ? -1 : a > b ? 1 : 0
,效果会好一些。那么这个怎么样?:
function sort(objectsArr, sortBy, sortOrder = 'ascending') {
function stringCompare(a, b) {
const left = a[sortBy], right = b[sortBy];
return left < right ? -1 : left > right ? 1 : 0;
}
return timsort.sort(objectsArr, stringCompare);
}
这仍然没有回答您 ascending/descending 的问题。从这里应该很简单,但是如果你不能得到它,请再问一个问题。