Javascript 按某些字母的多数出现对数组进行排序

Javascript 按某些字母的多数出现对数组进行排序,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有一个单词的数组和以下字母列表: searoiltnudcypmhgbkfwvzxjq 我想在此列表中按字母顺序对数组进行排序,以便在列表开头附近字母数量最多的单词首先出现。例如:以下内容: var wordList = "nymph, races, tundra"; 一旦分类,应为: wordList = "races, tundra, nymph"; 到目前为止,我为列表中的每个字母分配了以下权重: for (let h = 0; h < freqWords.length

我有一个单词的
数组和以下字母列表:

searoiltnudcypmhgbkfwvzxjq

我想在此列表中按字母顺序对
数组
进行排序,以便在列表开头附近字母数量最多的单词首先出现。例如:以下内容:

var wordList = "nymph, races, tundra"; 
一旦分类,应为:

wordList = "races, tundra, nymph"; 
到目前为止,我为列表中的每个字母分配了以下权重:

  for (let h = 0; h < freqWords.length; h++) {
     this["freq" + h] = h; 
  }
for(设h=0;h

接下来,我必须根据数组中包含的变量的数量为数组中的每个单词指定一个值,然后按照从最低值到最高值的顺序进行排序。不幸的是,我不知道实现这一点的语法

首先,如果您将字母列表转换为数组,并将单词列表转换为数组,则会容易得多。然后,您需要为
Array.prototype.sort
编写一个比较器函数,该函数计算所提供单词在所提供字母数组中的字母数。下面是一个解决您的问题的实现:

const letters = [
  's', 'e', 'a', 'r', 'o', 'i', 'l', 't', 'n', 
  'u', 'd', 'c', 'y', 'p', 'm', 'h', 'g', 'b', 
  'k', 'f', 'w', 'v', 'z', 'x', 'j', 'q'
];

const wordList = [
  'nymph', 
  'races', 
  'tundra'  
];

console.log(wordList);

const sortedList = wordList.sort((a, b) => {
  const aOccurences = letterOccurences(letters, a);
  const bOccurences = letterOccurences(letters, b);
  return aOccurences - bOccurences;
});

console.log(sortedList);

function letterOccurences(letters, word) {
  let occurences = 0;
  for (let i = 0; i < word.length; i++) {
    if (letters.includes(word.substring(i, i+1))) {
        occurences++;
    }
  }
  return occurences;
}
const字母=[
‘s’、‘e’、‘a’、‘r’、‘o’、‘i’、‘l’、‘t’、‘n’,
‘u’、‘d’、‘c’、‘y’、‘p’、‘m’、‘h’、‘g’、‘b’,
‘k’、‘f’、‘w’、‘v’、‘z’、‘x’、‘j’、‘q’
];
常量单词列表=[
“仙女”,
“比赛”,
“苔原”
];
console.log(wordList);
const sortedList=wordList.sort((a,b)=>{
const aOccurences=字母出现(字母,a);
const bOccurences=字母出现(字母,b);
返回aOccurences-bOccurences;
});
控制台日志(分类列表);
函数字母出现(字母、单词){
设发生次数=0;
for(设i=0;i
输入列表:
nymph、种族、苔原

结果:
苔原、若虫、小种(分别出现6次、5次和5次)


编辑:如果您需要我解释任何内容,或者语法不熟悉,请告诉我。

首先,如果您将字母列表转换为数组,如果您将单词列表转换为数组,会容易得多。然后,您需要为
Array.prototype.sort
编写一个比较器函数,该函数计算所提供单词在所提供字母数组中的字母数。下面是一个解决您的问题的实现:

const letters = [
  's', 'e', 'a', 'r', 'o', 'i', 'l', 't', 'n', 
  'u', 'd', 'c', 'y', 'p', 'm', 'h', 'g', 'b', 
  'k', 'f', 'w', 'v', 'z', 'x', 'j', 'q'
];

const wordList = [
  'nymph', 
  'races', 
  'tundra'  
];

console.log(wordList);

const sortedList = wordList.sort((a, b) => {
  const aOccurences = letterOccurences(letters, a);
  const bOccurences = letterOccurences(letters, b);
  return aOccurences - bOccurences;
});

console.log(sortedList);

function letterOccurences(letters, word) {
  let occurences = 0;
  for (let i = 0; i < word.length; i++) {
    if (letters.includes(word.substring(i, i+1))) {
        occurences++;
    }
  }
  return occurences;
}
const字母=[
‘s’、‘e’、‘a’、‘r’、‘o’、‘i’、‘l’、‘t’、‘n’,
‘u’、‘d’、‘c’、‘y’、‘p’、‘m’、‘h’、‘g’、‘b’,
‘k’、‘f’、‘w’、‘v’、‘z’、‘x’、‘j’、‘q’
];
常量单词列表=[
“仙女”,
“比赛”,
“苔原”
];
console.log(wordList);
const sortedList=wordList.sort((a,b)=>{
const aOccurences=字母出现(字母,a);
const bOccurences=字母出现(字母,b);
返回aOccurences-bOccurences;
});
控制台日志(分类列表);
函数字母出现(字母、单词){
设发生次数=0;
for(设i=0;i
输入列表:
nymph、种族、苔原

结果:
苔原、若虫、小种(分别出现6次、5次和5次)


编辑:如果您需要我解释任何内容,或者任何语法不熟悉,请告诉我。

一个较短的声明性函数式替代样式:

const letters = 'searoiltnudcypmhgbkfwvzxjq';
const input = "nymph, races, tundra"
const sorted = input.split(',').map(str => str.trim()).sort((aWord, bWord) => {

    const aCount = aWord.split('').filter(char => letters.includes(char)).length;
    const bCount = bWord.split('').filter(char => letters.includes(char)).length;

    return bCount - aCount;

});

一种较短的声明性功能样式替代方案:

const letters = 'searoiltnudcypmhgbkfwvzxjq';
const input = "nymph, races, tundra"
const sorted = input.split(',').map(str => str.trim()).sort((aWord, bWord) => {

    const aCount = aWord.split('').filter(char => letters.includes(char)).length;
    const bCount = bWord.split('').filter(char => letters.includes(char)).length;

    return bCount - aCount;

});

这样,列表开头字母数量最多的单词首先出现
,权重是多少?你试过写代码了吗?希望我能回答你上面的评论。我很困惑前进的方向。这没有多大意义-
{freq0:0,freq1:1,freq2:2…}
,这有什么作用,这是什么?您还没有显示调用上下文(甚至函数),我想我需要一个var,每个字母都有一个值,这样我就可以对照数组中的每个单词检查它,并得到一个可以排序的值。至于
这个
,这是我唯一能让它工作的方法,是不是不正确?只需使用一个普通对象,而不是改变函数的调用上下文?
,这样列表开头字母数最多的单词首先出现,权重是多少?你试过写代码了吗?希望我能回答你上面的评论。我很困惑前进的方向。这没有多大意义-
{freq0:0,freq1:1,freq2:2…}
,这有什么作用,这是什么?您还没有显示调用上下文(甚至函数),我想我需要一个var,每个字母都有一个值,这样我就可以对照数组中的每个单词检查它,并得到一个可以排序的值。至于
这个
,这是我唯一能让它工作的方法,是不是不正确?只需使用普通对象,而不是改变函数的调用上下文?太棒了,谢谢!将此应用到一个jotto播放程序中,在该程序中,计算机尝试猜测用户输入的单词,并在正确猜测所需的轮次上获得了巨大的改进。@ItaiYasur很高兴我能提供帮助:)太棒了,谢谢!将其应用到jotto playing程序中,在该程序中,计算机尝试猜测用户输入的单词,并在正确猜测所需的轮次上获得了巨大的改进。@ItaiYasur很高兴我能提供帮助:)这绝对是一个比我提供的更干净的解决方案,并且在不将字母和单词拆分为数组的情况下使用了他的初始输入这绝对是一个比我提供的更干净的解决方案,它利用了他的初始输入,而没有事先将字母和单词拆分成数组。