我的发现:
object.forEach
循环弄乱了元素的顺序(升序和降序),但是for循环工作正常。还有其他人也经历过吗?或对此有任何解释?我认为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;
}
我在这里使用了for循环,因为forEach
再次弄乱了单词数组的顺序,因此在for循环中我避免了它并执行插入操作,以便键(字符串)以降序排列,这里的数字表示多少该单词在单词数组中出现的次数。之后,我将调用此函数,该函数将首先从valueArray
中的Map对象获取值,然后按降序排序并保留前5个,以消除其余部分。然后在forEeach
上的mapObject
中,我检查map元素的值是否等于该数组,保留它,否则将其删除。为此,这很好,但是在此操作中,插入的降序也被弄乱了。这是函数。
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循环。我将地图对象转换为对象数组,并根据值降序对其进行了排序,这对我很有用。