我想在陣列中查找 number 的出現次數,然后顯示數字和按升序排列的數字的出現次數,如下所示:
let arr = [9,-10,2,9,6,1,2,10,-8,-10,2,9,6,1];
// {'-10': 2, '-8': 1, '1': 2, '2': 3, '6': 2, '9': 3, '10': 1}
我通過將它們存盤在一個物件中找到了陣列中每個數字的出現次數。當我嘗試 console.log numCount 時,所有數字都按升序排序,負數除外。
/*Find occurrences*/
let numCount = {};
for(let num of arr){
numCount[num] = numCount[num] ? numCount[num] 1 : 1;
}
console.log(numCount);
//{ '1': 2, '2': 3, '6': 2, '9': 3, '10': 1, '-10': 2, '-8': 1 }
我查了一下如何對物件進行排序,似乎這樣做的方法是將它們存盤在一個陣列中,然后對其進行排序。所以這就是我嘗試的:
/*Store them in array and then sort it*/
let sortedArray = [];
for(let item in numCount){
sortedArray.push([item, numCount[item]]);
}
sortedArray.sort(function(a,b){
return a[0] - b[0];
});
/*
console.log(sortedArray);
[
[ '-10', 2 ],
[ '-8', 1 ],
[ '1', 2 ],
[ '2', 3 ],
[ '6', 2 ],
[ '9', 3 ],
[ '10', 1 ]
]
*/
下一個方法應該在按升序排序的物件中顯示它們,但是當我嘗試它時,它在該物件的末尾以負數顯示它們,就像在開頭一樣。所以這是我被卡住的部分。
let sortedObject = {};
sortedArray.forEach(function(item){
sortedObject[item[0]] = item[1];
})
/*console.log(sortedObject);
{ '1': 2, '2': 3, '6': 2, '9': 3, '10': 1, '-10': 2, '-8': 1 }
*/
完整代碼:
let arr = [9,-10,2,9,6,1,2,10,-8,-10,2,9,6,1];
/*Find occurrences*/
let numCount = {};
for(let num of arr){
numCount[num] = numCount[num] ? numCount[num] 1 : 1;
}
/*Store them in array and then sort it*/
let sortedArray = [];
for(let item in numCount){
sortedArray.push([item, numCount[item]]);
}
sortedArray.sort(function(a,b){
return a[0] - b[0];
});
let sortedObject = {};
sortedArray.forEach(function(item){
sortedObject[item[0]] = item[1];
})
console.log(sortedObject);
uj5u.com熱心網友回復:
可能Map將允許您對物件執行您想做的操作,同時允許您設定鍵順序。
let arr = [9,-10,2,9,6,1,2,10,-8,-10,2,9,6,1];
/*Find occurrences*/
let numCount = new Map();
for(let num of arr){
numCount.set(num, (numCount.get(num) ?? 0) 1);
}
let sortedMap = new Map([...numCount.entries()].sort((a, b) => a[0] - b[0]));
console.log(sortedMap.get(-10));
console.log(...sortedMap.keys());
console.log(...sortedMap.values());
uj5u.com熱心網友回復:
物件屬性的排序不可靠,物件的顯示方式取決于console.log.
如果它是只是一個“顯示幕”的事情,那么你可以使用,例如
const sortedArray = [[-10, 2], [-8, 1], [1, 2], [2, 3], [6, 2], [9, 3], [10, 1]];
let result = '{' sortedArray.map(el => `'${el[0]}': ${el[1]}`).join(', ') '}';
console.log(result);
uj5u.com熱心網友回復:
關于如何在物件中對屬性/鍵進行排序有一些規則,如果您知道這些規則,它們就會被可靠地排序。
如果屬性是類似正數的(實際上所有屬性實際上都是字串,即使它們看起來像數字),它將被排序。如果沒有,它將按插入順序排序。但是 object 如何確定一個屬性值是否是類似數字的呢?
考慮鍵'9':首先它被轉換為一個數字,即 9。因為它是正數,然后它被轉換回字串,即 '9'。與第一個值相同。所以它被認為是類似正數的正數。
考慮鍵'-10': 首先將其轉換為 -10 的數字。因為它不是正數,所以它被認為是一個字串......其余的都是一樣的。
所以現在很明顯,對類似正數的屬性進行排序根本沒有必要。無論輸入陣列是否排序,結果都相同,順序由規則決定。
解決方案:
考慮鍵'09':首先將其轉換為 9 的數字。因為它是正數,然后將其轉換回字串 '9'。與第一個值不同。所以它被認為是一個字串。
所以讓我們在每個類似正數的前面放一個“0”,并在排序后將其轉換為字串。
sortedArray.forEach(function(item){
let key = parseInt(item[0])>0 ? '0' item[0] : item[0]
sortedObject[key] = item[1];
})
//{ "-10": 2, "-8": 1, 01: 2, 02: 3, 06: 2, 09: 3, 010: 1 }
請注意, parseInt 對于像 010 這樣的數字的行為是不同的,因為它假定它們是八進制的。
另一個更好的解決方案是使用地圖,在此處閱讀有關地圖及其與物件的差異的更多資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/346225.html
標籤:javascript 数组 排序 目的
