Сохранение порядка вставки В объект Map после удаления элементов

Мои выводы:

object.forEachloop - это беспорядочный порядок элемента (восходящий и нисходящий), но для цикла работает нормально. Кто-нибудь еще испытал это? или любое объяснение по этому поводу? Я думаю, что JavaScript не гарантирует порядок свойств объектов.

Чего я пытаюсь достичь? У меня есть массив строки типа, который сортируется в порядке убывания.

words: string[] = [];
words = this.getSomeStringArray();
word.sort();
word.reverse();

Затем я передал этот массив функции, названной countWordFrequency()ниже.

private CountWordFrequency(words: string[]) : Map<string, number> {
    let mapObject: Map<string, number> = new Map<string, number>();

    for(var i=0; i < words.length; i++) {
      !mapObject.has(words[i]) ? mapObject.set(words[i], 1) :
      mapObject.set(words[i], mapObject.get(words[i]) + 1); 
    }

    console.log(mapObject);
    return mapObject;
  }

Я использовал для цикла здесь, потому что forEachснова перепутал с порядком массива слов, поэтому для цикла я избегал его и выполнял вставку, чтобы ключи (строка) находились в порядке убывания, а число здесь показывает, сколько раз это слово произошло в массиве слов. После этого я вызываю эту функцию, которая сначала получает значения из объекта Map, valueArrayа затем сортируется в порядке убывания и сохраняет первые 5, исключая остальные. Тогда в forEeachна mapObjectя проверяю , если элемент карты имеет значение равно этот массив сохранить его еще удалить его. к этому хорошо, но опять же в этой операции, что нисходящий порядок вставки перепутался. Вот функция.

 private identifyTopFive(mapObject: Map<string, number>) : Map<string, number> {
    let valueArray: number[] = [];

    //Get all values from the map in array.
    valueArray = Array.from(mapObject.values());

    //Sort them in descending order.
    valueArray.sort( (a,b)=> { return b-a });

    //Delete duplicate values from array.
    valueArray = valueArray.filter((element, index, self)=> {
      return index == self.indexOf(element);
    });

    //Get only first 5 values in array and discard rest.
    valueArray = valueArray.slice(0,5);

    //Delete elements from the mapObject whose values who are not Top 5.

        mapObject.forEach((key,value,mapObject) => {
          if(!valueArray.includes(key))
          mapObject.delete(value);
      });

    console.log(valueArray);
    console.log(mapObject);
    return null;
  }

В этом случае существует какая-либо методика сохранения этого нисходящего порядка или любой другой структуры данных, которую я могу использовать, чтобы сохранить нисходящий порядок строковых значений вместе с их возникновением.

решаемая

Проблема заключалась в использовании структур данных, которые я использовал, а не для цикла forEach. Я преобразовал свой объект карты в массив объектов и отсортировал его на основе значения в порядке убывания, это сработало для меня.

javascript,angular,typescript,

1

Ответов: 0

Сохранение порядка вставки В объект Map после удаления элементов

Мои выводы:

object.forEachloop - это беспорядочный порядок элемента (восходящий и нисходящий), но для цикла работает нормально. Кто-нибудь еще испытал это? или любое объяснение по этому поводу? Я думаю, что JavaScript не гарантирует порядок свойств объектов.

Чего я пытаюсь достичь? У меня есть массив строки типа, который сортируется в порядке убывания.

words: string[] = [];
words = this.getSomeStringArray();
word.sort();
word.reverse();

Затем я передал этот массив функции, названной countWordFrequency()ниже.

private CountWordFrequency(words: string[]) : Map<string, number> {
    let mapObject: Map<string, number> = new Map<string, number>();

    for(var i=0; i < words.length; i++) {
      !mapObject.has(words[i]) ? mapObject.set(words[i], 1) :
      mapObject.set(words[i], mapObject.get(words[i]) + 1); 
    }

    console.log(mapObject);
    return mapObject;
  }

Я использовал для цикла здесь, потому что forEachснова перепутал с порядком массива слов, поэтому для цикла я избегал его и выполнял вставку, чтобы ключи (строка) находились в порядке убывания, а число здесь показывает, сколько раз это слово произошло в массиве слов. После этого я вызываю эту функцию, которая сначала получает значения из объекта Map, valueArrayа затем сортируется в порядке убывания и сохраняет первые 5, исключая остальные. Тогда в forEeachна mapObjectя проверяю , если элемент карты имеет значение равно этот массив сохранить его еще удалить его. к этому хорошо, но опять же в этой операции, что нисходящий порядок вставки перепутался. Вот функция.

 private identifyTopFive(mapObject: Map<string, number>) : Map<string, number> {
    let valueArray: number[] = [];

    //Get all values from the map in array.
    valueArray = Array.from(mapObject.values());

    //Sort them in descending order.
    valueArray.sort( (a,b)=> { return b-a });

    //Delete duplicate values from array.
    valueArray = valueArray.filter((element, index, self)=> {
      return index == self.indexOf(element);
    });

    //Get only first 5 values in array and discard rest.
    valueArray = valueArray.slice(0,5);

    //Delete elements from the mapObject whose values who are not Top 5.

        mapObject.forEach((key,value,mapObject) => {
          if(!valueArray.includes(key))
          mapObject.delete(value);
      });

    console.log(valueArray);
    console.log(mapObject);
    return null;
  }

В этом случае существует какая-либо методика сохранения этого нисходящего порядка или любой другой структуры данных, которую я могу использовать, чтобы сохранить нисходящий порядок строковых значений вместе с их возникновением.

решаемая

Проблема заключалась в использовании структур данных, которые я использовал, а не для цикла forEach. Я преобразовал свой объект карты в массив объектов и отсортировал его на основе значения в порядке убывания, это сработало для меня.

01JavaScript, угловая, машинопись,
Похожие вопросы