我创建了一个包含重复数据的食物名称数组。通过使用:
listFoodnames.forEach(x => {
counts[x] = (counts[x] || 0) + 1;
});
我可以计算数组中每个项目存在的次数。
使用:
Object.keys(counts).sort((a, b) => counts[b]-counts[a])
我可以将项目的数量从大到小排序,但是,我丢失了我想保留的实际数量。
我该如何解决这个问题?
$('document').ready(function() {
var listFoodnames = ["Batteries", "Bread", "Milk", "Bread", "Milk", "Milk"]
var counts = {};
listFoodnames.forEach(x => {
counts[x] = (counts[x] || 0) + 1;
});
console.log(counts) //LOGS EACH ITEM AS PROPERTY AND OCCURRENCES AS VALUE
var sortedCounts = Object.keys(counts).sort((a, b) => counts[b]-counts[a])
console.log(sortedCounts) //LOSES VALUES
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
最佳答案
不幸的是,根据规范,不能保证对象属性是有序的。您可以尝试使用对象数组。
另请注意,当您将数组中的项目组合成单个对象时,reduce
比 forEach
更合适。
const listFoodnames = ["Batteries", "Bread", "Milk", "Bread", "Milk", "Milk"];
const counts =
Object.values(
listFoodnames.reduce((a, foodName) => {
if (!a[foodName]) a[foodName] = { foodName, count: 0 };
a[foodName].count++;
return a;
}, {})
);
counts.sort((a, b) => a.count - b.count);
console.log(counts);
关于javascript - 按值对对象的属性进行排序并保留值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50807365/