0

在编制书目列表时,您经常需要在多个层次上进行排序。例如,如果同一作者和同一出版年份,则按标题(等)排序。在 SQL 中,这很容易。但是,我需要在 javascript 中执行此操作。我有一些 javascript 代码(一个 Word 插件),它通过 XmlHTTP 从多个数据库(在不同的服务器上)提取书目数据,然后编译一个完整的书目列表,该列表应该根据上面的三个层次结构进行排序。例如,如果我从多个 SQL 服务器返回以下原始数据:

  • a_author, 2000, a_title
  • c_author, 2011, b_title
  • b_author, 1899, c_title
  • a_author, 2000, d_title
  • a_author, 1999, e_title

然后,根据升序作者、升序年份、升序标题依次排序,我应该得到:

  • a_author, 1999, e_title
  • a_author, 2000, a_title
  • a_author, 2000, d_title
  • b_author, 1899, c_title
  • c_author, 2011, b_title

请注意,作者和标题字段是字符串排序,而年份是数字排序。

我知道如何在这些字段中的任何一个上使用 cmp 函数,但一次只能在一个字段上使用。在此,我的策略是从各种 SQL 数据库中创建一个普通的格式化书目条目数组,以及与书目数组(自动生成的)索引匹配的对象数组。因此(如果仅由作者订购):

        if (!finalizeReferences.includes(xmlResponse[j].bibEntry)) {
          finalizeReferences.push(xmlResponse[j].bibEntry);
          key = finalizeReferences.indexOf(xmlResponse[j].bibEntry);
          multipleOrder.push([key, xmlResponse[j].authorOrder]);
        }

      var bibliography = '';
      var key;
      multipleOrder.sort(function (a, b){return a[1].localeCompare(b[1])});
      if (ascDesc == 'DESC') { // Descending order?
        multipleOrder.reverse();
      }
      for (i = 0; i < multipleOrder.length; i++) {
        key = multipleOrder[i][0];
        bibliography += '<p>' + finalizeReferences[key] + '</p>';
      }

例如,finalReferences 可能是:

[“a_author (2000) .a_title . Oxford: OUP.”, “a_author (2000). d_title . Cambridge: CUP.”, “b_author (1899). c_title . Cambridge (MA): MIT.”, (etc.) ]

而multipleOrder 将是:

[[0, a_author], [1, a_author], [2, b_author], (etc.)](其中数字指的是 finalReferences 的索引)。

multipleOrder.sort 的比较函数,然后对作者字段进行排序(如果需要,反转 multipleOrder 对象),然后循环 multipleOrder,以正确的顺序拉出适当的完整书目条目。

现在 。. . 如果我有以下三个对象数组:

multipleOrderAuthor = [[0, a_author], [1, a_author], [2, b_author], (etc.)]

multipleOrderYear = [[0, 2000], [1, 2000], [2, 1899], (etc.)]

multipleOrderTitle = [[0, a_title], [1, d_title], [2, c_title], (etc.)]

我将如何修改上面的第二段代码,以便我可以提取按作者然后年份然后标题(或年份然后作者然后标题等)排序的书目条目?

4

0 回答 0