【问题标题】:manually sorting a paragraph by made-up alphabet with javascript使用 javascript 按合成字母对段落进行手动排序
【发布时间】:2017-01-25 14:45:54
【问题描述】:

我正在尝试按字母顺序对段落进行排序,不是按照正常的 ABC 而是按照编造的(var 顺序)。

我编写了这个函数,它工作得很好,但仅适用于每个单词的第一个字母 - 也不是单词内排序(例如,在正确的 ABC 中,'banana' 会出现在 'birthday' 之前)。

我不知道从这里去哪里。

$("#send").click(function () {
       var text = $("#text").val().replace(/[^A-Za-z0-9_\s]/g, "").toUpperCase().split(" ");
       var order = ["Q", "B", "K", "D", "H", "V", "Z", "E", "F", "O", "G", "L", "M", "S", "N", "P", "I", "X", "A", "R", "W", "U", "C", "J", "T", "Y"];
       var i, t, j;
       var newText = []; //  will hold the new alphabet
       // function to sort the words:
       for (i = 0; i < order.length; i++) {
             for (t = 0; t < text.length; t++) {
                  var firstChar = text[t][0];
                  if (order[i] == firstChar) {
                      newText.push(text[t]);
                  }
             }
       }
       console.log(newText.join(','));
});

编辑: 一个示例输入可以是:“嗨,你不觉得这很棒吗”, 我希望输出是:“不要觉得你太棒了”。

【问题讨论】:

  • 只是好奇,给字母表中的每个字母分配一个排序等级,然后按等级排序吗?
  • 请添加一些示例数据和想要的结果。
  • 这应该很容易实现,但我们需要首先查看您的 HTML - 或者至少是输入值 - 以及预期的输出

标签: javascript jquery sorting alphabetical


【解决方案1】:

您可以使用带有字母索引的对象,并使用带有回调的Array#sort 来查找每个字母并计算顺序。

function foo(text) {
  var text = text.replace(/[^A-Za-z0-9_\s]/g, "").toUpperCase().split(" "),
      order = "QBKDHVZEFOGLMSNPIXARWUCJTY",
      ref = {};

  order.split('').forEach(function (a, i) { ref[a] = i + 1; });
  text.sort(function (a, b) {
      var i = 0, v;
      do {
          v = (ref[a[i]] || 0) - (ref[b[i]] || 0);
          i++;
      } while (!v)
      return v;
  });
  console.log(text.join(', '));
}

foo('a aa ab b ba bb');
foo('banana birthday');

【讨论】:

    【解决方案2】:

    您的算法的问题在于它只比较每个单词中的第一个字母,但如果字母相同,算法需要比较每个单词中的下一个字母。这是一个使用递归的解决方案:

    function doSort(inputArr) {
    
      var words = inputArr.slice(0);
    
      var alphabet = ["Q", "B", "K", "D", "H", "V", "Z", "E", "F", "O", "G", "L", "M", "S", "N", "P", "I", "X", "A", "R", "W", "U", "C", "J", "T", "Y"];
    
      words.sort(function(item1, item2) {
        return sortRecursive(item1, item2, 0);
      });
    
      function sortRecursive(item1, item2, idx) {
    
        if (item1.length <= idx && item2.length <= idx) {
          return 0;
        } else if (item1.length <= idx) {
          return -1;
        } else if (item2.length <= idx) {
          return 1;
        } else if (item1[idx] == item2[idx]) {
          return sortRecursive(item1, item2, idx+1);
        } else {
          return alphabet.indexOf(item1[idx].toUpperCase()) - alphabet.indexOf(item2[idx].toUpperCase());
        }
      }
    
      return words;
    }
    
    var arr = ["banana", "quebec", "bird", "birthday", "birdman", "bird"];
    var sortedArr = doSort(arr);
    
    console.log('unsorted',arr);
    console.log('sorted', sortedArr);
    

    https://jsfiddle.net/2qgaaozo/

    【讨论】:

      猜你喜欢
      • 2021-11-11
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 2013-05-01
      • 2018-12-03
      • 2016-01-11
      • 1970-01-01
      • 2019-04-21
      相关资源
      最近更新 更多