Как отсортировать массив по другому массиву в javascript? - PullRequest
1 голос
/ 05 февраля 2020

Я считаю слова в абзаце по частоте вхождений, теперь мне нужно отсортировать их тоже, например [это: 2, это: 3, это: 1] до [это: 3, это: 2, это: 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);

}```

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Вы можете попробовать что-то вроде следующего:

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"

Fiddle: 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 голосов
/ 05 февраля 2020

Невозможно отсортировать массив ключей в соответствии с массивом значений, но вы можете сделать что-то, чтобы сопоставить правый ключ с правильным значением, проверив, если (arr [ключ] == arr [значение]) и если ключ и значение являются равный, то вы можете положить sh эту пару значений ключа в новый массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...