Javascript 为什么我的数组排序有问题?

Javascript 为什么我的数组排序有问题?,javascript,arrays,sorting,Javascript,Arrays,Sorting,我试着做以下几点 首先,输入一个字符串并计算唯一单词的数量。 其次,按降序排列唯一字数。 第三,如果两个单词的词数相同,则按出现顺序排列。 问题:为什么单词“up”首先出现在我返回的数组中 var doc = "Cause I'm Slim Shady, yes I'm the real Shady, All you other Slim Shadys are just imitating So won't the real Slim Shady, please stand up, Pleas

我试着做以下几点

首先,输入一个字符串并计算唯一单词的数量。
其次,按降序排列唯一字数。
第三,如果两个单词的词数相同,则按出现顺序排列。

问题:为什么单词“up”首先出现在我返回的数组中

var doc = 
"Cause I'm Slim Shady, yes I'm the real Shady, All you other Slim Shadys are just imitating So won't the real Slim Shady, please stand up, Please stand up, Please stand up";

function wordCountEngine(doc) {
    var stringModArr = doc.replace(/[.,'\/#!$%\^&\*;:{}=\-_`~?()]/g, "").toLowerCase().split(" ");
    var wordLibrary = {};

    for (let i = 0; i < stringModArr.length; i++) {
        if (wordLibrary.hasOwnProperty(stringModArr[i])) {
            wordLibrary[stringModArr[i]] = String((Number(wordLibrary[stringModArr[i]])) + 1);
        } else {
            wordLibrary[stringModArr[i]] = '1';
        }
    }

    var sortable = [];
    for (var word in wordLibrary) {
        sortable.push([word, wordLibrary[word]]);
    }

    var final = sortable.sort(function(a, b) {
        return b[1] - a[1];
    });

    return final;
}

wordCountEngine(doc)
var doc=
“因为我是苗条树荫,是的,我是真正的树荫,所有其他苗条树荫只是模仿,所以不会真正的苗条树荫,请站起来,请站起来,请站起来”;
函数wordCountEngine(doc){
var stringModArr=doc.replace(/[,'\/\\!$%\^&\*;:{}=\-\\-\\`~?()]/g,“”).toLowerCase().split(“”);
var wordLibrary={};
for(设i=0;i
首先显示“up”,因为您的函数是基于“count”降序排序的

> wordCountEngine(doc)
[ [ 'up', '3' ],
  [ 'slim', '3' ],
  [ 'shady', '3' ],
  [ 'please', '3' ],
  [ 'stand', '3' ],
  [ 'the', '2' ],
  [ 'real', '2' ],
  [ 'im', '2' ],
  [ 'you', '1' ],
  [ 'cause', '1' ],
  [ 'shadys', '1' ],
  [ 'are', '1' ],
  [ 'just', '1' ],
  [ 'imitating', '1' ],
  [ 'so', '1' ],
  [ 'wont', '1' ],
  [ 'yes', '1' ],
  [ 'all', '1' ],
  [ 'other', '1' ] ]

如果要按单词字母顺序排序,请在调用
sort

时使用0索引而不是1,按顺序进行排序,但排序时会丢失出现的顺序

为了将其取回,您需要根据事件对其计数进行加权。这可以通过切片来创建一个新的阵列来完成,然后在比较中考虑它们以前的顺序

var final = sortable.slice().sort(function(a, b) {
  var occurenceWeightA = (sortable.length - sortable.indexOf(a)) / sortable.length;
  var occurenceWeightB = (sortable.length - sortable.indexOf(b)) / sortable.length;
  return (occurenceWeightB + (+b[1])) - (occurenceWeightA + (+a[1]));
});


使用
(+b[1])
是为了确保存在整数数学而不是字符串串联<代码>+
是转换为数字的缩写。

用于排序功能的排序算法无法确保原始顺序。如果将日志放在compareFunction中,就可以调试它。如果需要订单,那么在编写代码时必须考虑到这一点。下面的代码可能会有所帮助

var文件= “因为我是苗条树荫,是的,我是真正的树荫,所有其他苗条树荫只是模仿,所以不会真正的苗条树荫,请站起来,请站起来,请站起来”

函数wordCountEngine(doc){
var stringModArr=doc.replace(/[,'\/\\\!$%\^&\*;:{}=\-\-\\`~?()]/g,
).toLowerCase().split(“”);
var wordLibrary={};
for(设i=0;i[a[1],a[2]];
}
wordCountEngine(文档)

这里有一种稍有不同的方法,它在你的
字库中添加一个对象,作为单词键的值,该对象跟踪句子中出现的单词以及之前的计数

这使您能够更好地跟踪并在以后进行排序,现在您有了这样做的元数据:

var文件=
“因为我是苗条树荫,是的,我是真正的树荫,所有其他苗条树荫只是模仿,所以不会真正的苗条树荫,请站起来,请站起来,请站起来”;
函数wordCountEngine(doc){
var stringModArr=doc.replace(/[,'\/\\!$%\^&\*;:{}=\-\\-\\`~?()]/g,“”).toLowerCase().split(“”);
var wordLibrary={};
for(设i=0;ilog(wordCountEngine(doc))
它应该按计数排序。然而,当两个单词有相同的计数时,它应该按照出现的顺序进行排序。所以“苗条”、“阴凉”、“请”、“站立”都是3(就像“向上”是3)并且都是有序的。但是“up”应该在“stand”之后(参见doc变量中的短语)。传递给
sort
的函数需要返回一个整数。如果
b[1]-a[1]
为零,可能需要执行额外的逻辑?
   function wordCountEngine(doc) {
     var stringModArr = doc.replace(/[.,'\/#!$%\^&\*;:{}=\-_`~?()]/g, 
      "").toLowerCase().split(" ");
var wordLibrary = {};

for (let i = 0; i < stringModArr.length; i++) {
    if (wordLibrary.hasOwnProperty(stringModArr[i])) {
        wordLibrary[stringModArr[i]] = String((Number(wordLibrary[stringModArr[i]])) + 1);
    } else {
        wordLibrary[stringModArr[i]] = '1';
    }
}

var sortable = [];
let i = 0;
for (var word in wordLibrary) {
    sortable.push([i, word, wordLibrary[word]]);
    i++;
}
var final = sortable.sort(function(a, b) {
    if(b[2] - a[2] != 0) {
      return b[2] - a[2];
    } else {
      return a[0] - b[0];
    }
});

return final.map(a => [a[1], a[2]]);
  }

  wordCountEngine(doc)