Мои выводы:
object.forEach
loop - это беспорядочный порядок элемента (восходящий и нисходящий), но для цикла работает нормально. Кто-нибудь еще испытал это? или любое объяснение по этому поводу? Я думаю, что 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,
Мои выводы:
object.forEach
loop - это беспорядочный порядок элемента (восходящий и нисходящий), но для цикла работает нормально. Кто-нибудь еще испытал это? или любое объяснение по этому поводу? Я думаю, что 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, угловая, машинопись,