如何根据javascript中的另一个数组对数组进行排序?

问题描述 投票:1回答:2

我现在也按出现频率对段落中的单词进行计数,例如,我也需要对它们进行排序,例如[this:2,is:3,it:1]到[is:3,this:2,it:1]。我将键和值分为两个不同的数组,然后我对值数组进行了排序,现在我想对键数组进行排序

console.log('app running');
function getFrequencyOfWord(word : string) {
   let counting: any = {};

   let wordSplit: any = word.split(' ');

   wordSplit.forEach(function (word: any) {

       if (counting[word]) {
               counting[word]++;
       }

       else {
           counting[word] = 1;
       }

       })

       var arr1 = Object.keys(counting);
       var arr2 = arr1.map((suboor)=> {
           return counting[suboor];
       });
       for (var i : number = 0; i < arr2.length; i++) {
           for (var j = 0; j < (arr2.length -i -1); j++) {

               if (arr2[j] > arr2[j+1]) {
                   const lesser = arr2[j+1];
                   arr2[j+1] = arr2[j];
                   arr2[j] = lesser;
               }
           }
       }

       console.log(arr2);  
       console.log(arr1);

}```
javascript arrays sorting
2个回答
1
投票

您可以尝试以下操作:

let word = "moo moo moo hello one two three one";
let wordSplit = word.split(' ');
var counting = [];

wordSplit.forEach(function (word) {

    if (counting[word]) {
            counting[word]++;
    }

    else {
        counting[word] = 1;
    }

    })

console.log("Counting ...");console.log(counting);

function swap(json){
  var ret = {};
  for(var key in json){
    let element = ret[json[key]] ;
    //console.log("element");console.log(element);

    if(element == undefined){
      ret[json[key]] = element= [];
    }

    element.push(key);

    //console.log("element");console.log(element);

  }
  return ret;
}

let result = swap(counting);
console.log("RESULT ...");console.log(result);

var finalResult = [];

for(var key in result){
    finalResult = finalResult.concat(result[key]);
 }

console.log("Final RESULT ...");console.log(finalResult);

输出

Word Count: 
[moo: 3, hello: 1, one: 2, two: 1, three: 1]

Result: 
{1: Array(3), 2: Array(1), 3: Array(1)}
1: (3) ["hello", "two", "three"]
2: ["one"]
3: ["moo"]

Final Result
0: "hello"
1: "two"
2: "three"
3: "one"
4: "moo"

小提琴:https://jsfiddle.net/menelaosbgr/xe9u7mqk/33/

更新

问题是您实际上有一个对象映射而不是数组。对象数组将类似于[{is:3},{this:2},{it:1}]。进行转换并不难。但是,我认为最好有这样的对象{word:X, count:x}。见下文:

let word = "this this is is it is";

let wordSplit = word.split(' ');

var counting = [];


wordSplit.forEach(function (word) {

    if (counting[word]) {
            counting[word]++;
    }

    else {
        counting[word] = 1;
    }

    })

console.log("Counting ...");console.log(counting);

function swap(json){
  var ret = {};
  for(var key in json){
    let element = ret[json[key]] ;
    //console.log("element");console.log(element);

    if(element == undefined){
      ret[json[key]] = element= [];
    }

    element.push({count:json[key], word:key});

    //console.log("element");console.log(element);

  }
  return ret;
}


let result = swap(counting);
console.log("RESULT ...");console.log(result);


//Reverse it and make it into objects...
let reversedResult = Object.assign([], result ).reverse();
console.log("RESULT-REVERSED ...");console.log(reversedResult); 


//Final Conatenated Array
var concatenatedArray = [];

for(var key in reversedResult){
    concatenatedArray = concatenatedArray.concat(reversedResult[key]);
 }

console.log("CONCATENATED-ARRAY ...");console.log(concatenatedArray);

结果:

0: {count: 3, word: "is"}
1: {count: 2, word: "this"}
2: {count: 1, word: "it"}  

小提琴:https://jsfiddle.net/menelaosbgr/xe9u7mqk/49/


0
投票

这不可能根据值的数组对键的数组进行排序,但是您可以通过检查if(arr [key] == arr [value])以及键和值是否相等来将右键映射到正确的值然后您可以将该键值对推入新数组。

© www.soinside.com 2019 - 2024. All rights reserved.