-1

这是一个非常接近我要在我的项目中实现的代码片段: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

我试图通过每个对象的名称属性对我的对象数组进行排序,该属性包含一个字符串——尽管我的函数也可以传递另一个项目来排序(即“年龄”)。

TimSort 的文档不是很清楚,通过查看源代码我仍然不太能够弄清楚如何配置我的代码。

您会在我的代码中注意到,我还想选择按“升序”或“降序”进行排序,但我不确定如何将其添加到我正在使用的 TimSort 方法中。

4

1 回答 1

1

您的字符串比较不比较字符串。它仅适用于数字等类型或具有valueOf日期的类型。

也许如果你把它改成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);
}

这仍然不能回答您的升序/降序问题。从这里开始应该很简单,但如果你不能得到它,请再问一个问题。

于 2017-11-17T16:56:37.987 回答